3

そのため、データ ソースとして dbUnit で使用している XML ファイルがあり、その中にいくつかの日付が含まれています。ファイルの日付は「2010-02-04」のようになっていますが、ロードされてテストで印刷または比較するためにアクセスすると、日付は「2010-02-03 23:00」と見なされます。

これは EDT/EST に関係していると推測していますが、dbUnit (または休止状態) に正しいタイムゾーンを使用させる方法がわかりません。

dbUnit と日付の経験がある人はいますか?

ありがとう、ピーター

編集
わかりました、何らかの理由で、正しいEDTとして日付を読み取り、それをESTとして保存していますが、これは技術的には正しくありません(ここではEDTです)が、私のコンピューターでは正しいですESTだそうです。この変換により、日付が 1 時間「失われます」。Java が私たちが EST であると考える理由がわかりません (Windows XP は私たちがそうではないことを知っています)、そして dbUnit が日付を EDT にすべきだと考える理由が二重にわかりません。これはかなり紛らわしいです。

EDIT それは問題ではないので、Hibernate XMLを取り出しました。1. dbUnit はソース XML から日付を文字列として読み取り、それを java.sql.Date に変換します。本質的に、これらは時間/分/秒を保存しませんが、ミリ秒を見ると、EDT では真夜中ですが、UTC では午前 4 時であることを示すために、明らかに 4 時間分調整されています。また、これは、「アメリカ/ニューヨーク」または同等のラベルが付けられたタイムゾーンを持つカレンダーによって支えられています。正確には思い出せません。2. この日付を印刷するたびに、EST であると認識している私のシステムは、UTC の午前 4 時を前日の午後 11 時に再変換します。3.例としてテスト用に自分で日付を作成するときはいつでも、それとUTCの違いを作るために5時間分のミリ秒。明らかに、これらは異なる「日付」であり、失敗します。

本当の問題は 2 つあると思います: 1. コンソールが EST だと思うのはなぜですか? 私の知る限り、Windows XP の設定は正しいです。Java 1.4 に誤った TZ を取得する問題があったことは理解していますが、これは修正されており、(おそらく) 1.6 を実行していると思います。2. 同じ JVM 内にある dbUnit が適切なファンシー TZ を使用するのはなぜですか。

日付を一緒に使用するのをやめることもできると思いますが、必ずしもその余裕があるわけではありません。

4

2 に答える 2

3

5年後、あなたはかなり多くのことを書いたので、あなたの問題を正しく理解していることを願っています. それにもかかわらず、私は同様の問題を抱えていました。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));DbUnit または Hibernate は、Spring アプリケーションで設定したにもかかわらず、UTC 時間を現地時間に切り替えました。Andyが指摘したように、-Duser.timezone=EDTを使用すると、テストに合格しました。このため、実際のアプリケーションが開始される前に DbUnit がデータベースをいっぱいにするため、デフォルトのタイムゾーンの設定が遅すぎると想定しました。

これを回避するために、UTC と ETC (または他のタイムゾーン) については、それに応じて切り替える 2 つの次の回避策を考え出しました。

定期申請

すべてのテスト クラスでデフォルトのタイム ゾーンを設定する必要があります。自分のことを繰り返さないように、すべてのテストを延長しUtcTimeZoneTestます。

public class UtcTimeZoneTest {
  static {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  }
}

public class TestClass extends UtcTimeZoneTest {
  // your tests
}

春の申し込み

Springアプリケーションでも同じことができますが、次のほうが少しいいと思います。繰り返しますが、すべてのテスト クラスでこれを行う必要があります。(私は Spring の専門家ではありませんが、これに欠点がないことを願っています。)

public class UtcSpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
  static {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  }

  public UtcSpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
    super(clazz);
  }
}

@RunWith(UtcSpringJUnit4ClassRunner.class)
public class TestClass {
  // your tests
} 
于 2015-11-06T12:02:13.197 に答える
0

テストをどのように実行していますか? 次の VM 引数をコマンド ラインに追加してみてください (または、テストを実行しています)。

-Duser.timezone=EDT
于 2010-09-30T15:11:30.947 に答える