Java日历错误?

Java日历错误?,java,java.util.calendar,Java,Java.util.calendar,经过大量调试,我将问题缩小到以下代码段: 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()); } } 有人知道为什么c.se

经过大量调试,我将问题缩小到以下代码段:

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

有人知道为什么
c.set(2015,2,27,2,0)
会返回
凌晨3点而不是
凌晨2点

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

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


想想你的时间就在DST时间,它向前移动一个小时,或者向后移动一个小时,而不经历这段时间

所以这不是bug,而是特性。

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
当您更改不使用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
publicstaticvoidcalendarbug(){

对于(inti=0;iIt不是一个bug,它是一个特性。感谢您的详细回答!