【问题标题】:Java GregorianCalendar TimezoneJava GregorianCalendar 时区
【发布时间】:2012-06-14 10:42:41
【问题描述】:

我对 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),它工作正常。

有人知道为什么会出现这个问题吗?

最好, 迈克尔

【问题讨论】:

  • 您使用的是哪个版本的 Java? ;-) 有时一个版本中存在错误,而其他版本中没有。

标签: java timezone gregorian-calendar


【解决方案1】:

将这些行添加到您的程序中:

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】:

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-08-21
        • 2023-03-06
        • 2021-01-02
        • 2013-03-20
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多