【问题标题】:Java Calendar bug?Java 日历错误?
【发布时间】:2014-06-16 20:17:18
【问题描述】:

经过大量调试后,我将问题缩小到以下 sn-p:

public static void calendarBug() {
    for (int i=0 ; i<6 ; i++) {
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set(2015, 2, 27, i, 0);
        System.out.println(c.getTime());
    }
}

运行它会得到以下输出:

Fri Mar 27 00:00:00 IST 2015
Fri Mar 27 01:00:00 IST 2015
Fri Mar 27 03:00:00 IDT 2015
Fri Mar 27 03:00:00 IDT 2015
Fri Mar 27 04:00:00 IDT 2015
Fri Mar 27 05:00:00 IDT 2015

有谁知道为什么c.set(2015,2,27,2,0) 返回3AM 而不是2AM

【问题讨论】:

  • 这不是一个错误,它是一个特性。

标签: java java.util.calendar


【解决方案1】:

想想你的时间正好在 DST 时间,它向前移动一小时或向后移动一小时,而没有经历这个时间部分。

所以这不是错误,而是功能。

当您更改不使用 DST 的时区(比如说加拿大/东萨斯喀彻温省)时,您会看到您所期望的。

这是一个例子。

public static void calendarBug() {
    for (int i=0 ; i<6 ; i++) {
        Calendar c = Calendar.getInstance();

        c.setTimeZone(TimeZone.getTimeZone("Canada/East-Saskatchewan"));
        c.clear();
        c.set(2015, 2, 27, i, 0);
        System.out.println(c.getTime());
    }
}

Fri Mar 27 08:00:00 EET 2015
Fri Mar 27 09:00:00 EET 2015
Fri Mar 27 10:00:00 EET 2015
Fri Mar 27 11:00:00 EET 2015
Fri Mar 27 12:00:00 EET 2015
Fri Mar 27 13:00:00 EET 2015

【讨论】:

  • 感谢您的详细解答!
【解决方案2】:

这很可能是您的时区的 DST 切换。

3 月 27 日是 2015 年 3 月的最后一个星期五。这是在以色列、约旦、叙利亚、约旦河西岸等地进行夏令时转换的日子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多