对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又没有自动处理,这又是因为什么??
/*
* 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又没有自动处理,这又是因为什么??
将后半段的开始时间改一下:
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
TimeZone.setDefault(TimeZone.getDefault().getTimeZone("GMT+8"));
或加启动参数
-Duser.timezone=GMT+8
搞定!!