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())); 

我在默认时区 = 美国太平洋的机器上执行了上面给定的代码,但机器在德国运行。

结果如下:

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),所以我不知道为什么它在你的第二台机器上工作。

于 2012-06-14T10:51:32.510 回答
2

2011 年 11 月 6 日是美国夏令时结束的时间。因此,您所看到的是时钟在 11 月 6 日凌晨 2 点响起,然后它回滚到凌晨 1 点,回落到标准时间一个小时。因此,我相信太平洋时间的偏移量也会从 GMT 的 -7 变为 -8。因此,从我所看到的情况来看,它工作正常。

于 2012-06-14T12:44:17.120 回答
1

我建议您在 Joda-Time 中使用公历年表

于 2012-06-14T10:46:08.660 回答
0

请在您的控制面板中检查您尚未激活夏令时。这个bug可能是因为这个

于 2012-06-14T12:48:05.963 回答