6

Java グレゴリオ暦に奇妙な問題があります。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S Z");
sdf.setTimeZone(TimeZone.getTimeZone("US/Pacific"));

GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific"));
cal1.setTimeInMillis(1320566400000L);

GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific"));
cal2.setTimeInMillis(1320570000000L);

System.out.println(sdf.format(cal1.getTime()));
System.out.println(sdf.format(cal2.getTime())); 

デフォルトのタイムゾーン = US Pacific のマシンで上記のコードを実行しましたが、マシンはドイツで実行されています。

結果は次のとおりです。

2011-11-06 01:00:00:0 -0700
2011-11-06 01:00:00:0 -0800

結果に異なるタイムゾーンがある理由が本当にわかりません...別のマシン(デフォルトのタイムゾーン= GMT)でもコードをテストしましたが、正しく動作します。

なぜこの問題が発生するのか、誰かが考えを持っていますか?

ベスト、マイケル

4

4 に答える 4

6

次の行をプログラムに追加します。

for (int i=0; i<24; i++) {
    cal1.add(Calendar.MINUTE, i*5);
    System.out.println(" : " + sdf.format(cal1.getTime()));
}

そして、あなたは見るでしょう:

 : 2011-11-06 01:00:00:0 -0700
 : 2011-11-06 01:05:00:0 -0700
 : 2011-11-06 01:15:00:0 -0700
 : 2011-11-06 01:30:00:0 -0700
 : 2011-11-06 01:50:00:0 -0700
 : 2011-11-06 01:15:00:0 -0800
 : 2011-11-06 01:45:00:0 -0800
 : 2011-11-06 02:20:00:0 -0800
 : 2011-11-06 03:00:00:0 -0800

夏時間から冬時間に変わっているようです。私のタイムゾーンは CET (UTC+01:00) であるため、2 台目のマシンでなぜそれが機能しているのかわかりません。

于 2012-06-14T10:51:32.510 に答える
2

2011 年 11 月 6 日は、米国でサマータイムが終了した日でした。つまり、時計は 11 月 6 日の午前 2 時を打った後、午前 1 時に戻り、標準時間に 1 時間戻ります。したがって、オフセットも GMT から -7 から -8 に変化します。太平洋時間だと思います。だから、私が見ることができるものから正しく動作しています。

于 2012-06-14T12:44:17.120 に答える
1

Joda-Time ではグレゴリオ暦を使用することをお勧めします

于 2012-06-14T10:46:08.660 に答える
0

コントロール パネルで、Summer's time を有効にしていないことを確認してください。このバグはこれが原因かもしれません

于 2012-06-14T12:48:05.963 に答える