对Java夏令时的处理,虽然看过一些资料也查阅了JDK,但还是有些地方不是很明白。Java处理夏令时应该是默认自动处理的,但下面这段程序我运行之后看结果前后有些矛盾:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*
 * China implemented DLS in 1987:
 * 1987-4-12 to 1987-9-13
 */
Calendar cal = Calendar.getInstance();
//cal.set(cal.YEAR, 2001); 
//Can see the difference if using 2001 but not 1987
cal.set(cal.YEAR, 1987);
cal.set(cal.MONTH, 3);//Apr
cal.set(cal.DAY_OF_MONTH, 11);
cal.set(cal.HOUR_OF_DAY, 23);
cal.set(cal.MINUTE, 0);
cal.set(cal.SECOND, 0);
System.out.println(sdf.format(cal.getTime()));
for(int i = 1; i < 25; i ++) {
cal.add(cal.HOUR_OF_DAY, 1);
System.out.println(sdf.format(cal.getTime()));
}

cal = Calendar.getInstance();
cal.set(cal.YEAR, 1987);
cal.set(cal.MONTH, 8);//Sep
cal.set(cal.DAY_OF_MONTH, 12);
cal.set(cal.HOUR_OF_DAY, 23);
cal.set(cal.MINUTE, 0);
cal.set(cal.SECOND, 0);
System.out.println(sdf.format(cal.getTime()));
for(int i = 1; i < 27; i ++) {
cal.add(cal.HOUR_OF_DAY, 1);
System.out.println(sdf.format(cal.getTime()));
}1987年中国实行夏令时的时间是1987-4-12 至 1987-9-13
程序前半段输出:
1987-04-11 23:00:00
1987-04-12 01:00:00
1987-04-12 02:00:00
1987-04-12 00:00:00被自动跳过说明java在显示时自动处理了夏令时,但后半段输出:
1987-09-12 23:00:00
1987-09-13 00:00:00
1987-09-13 01:00:00
... ...
1987-09-13 23:00:00
1987-09-14 00:00:00
1987-09-14 01:00:00
当退出夏令时时间段时,java又没有自动处理,这又是因为什么??

解决方案 »

  1.   


    将后半段的开始时间改一下:
    cal.set(cal.HOUR_OF_DAY, 23); -》 cal.set(cal.HOUR_OF_DAY, 20);运行结果:
    1987-09-12 20:00:00
    1987-09-12 21:00:00
    1987-09-12 22:00:00
    1987-09-12 23:00:00
    1987-09-12 23:00:00

    1987-09-13 00:00:00
    1987-09-13 01:00:00
      

  2.   

    估计很少人会想这个问题,如果不特殊考虑项目一定会遇到时间问题。设置应用的
    TimeZone.setDefault(TimeZone.getDefault().getTimeZone("GMT+8"));
    或加启动参数
    -Duser.timezone=GMT+8
    搞定!!