设为首页 加入收藏

TOP

Java中的TimeZone夏令时问题解决(一)
2015-02-13 18:23:44 来源: 作者: 【 】 浏览:52
Tags:Java TimeZone 夏令 问题 解决

在Linux上使用system-config-date工具来设置了一个TimeZone之后(设置的结果会被记录在/etc/sysconfig/clock文件中),在进出夏令时的时候Java中取的时间不能跟着夏令时的时钟变化,从而导致Java中的系统时间出现混乱。


我们写了一个小程序用来获取当前机器上的TimeZone信息,以及打印一些时间看看进/出夏令时的时候时间的变化。


import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
?
public class TimeZoneTest {
? ? public static void main(String[] args) {
? ? ? ? TimeZone tz = TimeZone.getDefault();
? ? ? ? System.out.println("tz: " + tz);
? ? ? ?
? ? ? ? int offset = tz.getRawOffset();
? ? ? ? System.out.println("raw offset: " + offset);
? ? ? ?
? ? ? ? int dstSavings = tz.getDSTSavings();
? ? ? ? System.out.println("dstSavings: " + dstSavings);
? ? ? ?
? ? ? ? SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
? ? ? ? while(true) {
? ? ? ? ? ? Calendar cal = Calendar.getInstance();
? ? ? ? ? ? String msg = "[" + sdf.format(cal.getTime()) + "] " + cal.getTime();
? ? ? ? ? ? msg += ", offset: " + TimeZone.getDefault().getOffset(cal.getTimeInMillis());
? ? ? ? ? ? System.out.println(msg);
? ? ? ? ? ?
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? Thread.sleep(60 * 1000);
? ? ? ? ? ? } catch (InterruptedException ex) {
? ? ? ? ? ? ? ? ex.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}


下面两个正确的Case是在设置了TimeZone为“America/Los_Angeles”的情况下运行的结果


Case 1: 设置系统时间为2014-03-09 01:59:00 AM


tz: sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
raw offset: -28800000
dstSavings: 3600000
[2014-03-09 01:59:03] Sun Mar 09 01:59:03 PST 2014, offset: -28800000
[2014-03-09 03:00:03] Sun Mar 09 03:00:03 PDT 2014, offset: -25200000
[2014-03-09 03:01:03] Sun Mar 09 03:01:03 PDT 2014, offset: -25200000


Case 2: 设置系统时间为2014-11-02 12:59:00 AM


tz: sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
raw offset: -28800000
dstSavings: 3600000
[2014-11-02 01:59:32] Sun Nov 02 01:59:32 PDT 2014, offset: -25200000
[2014-11-02 01:00:32] Sun Nov 02 01:00:32 PST 2014, offset: -28800000
[2014-11-02 01:01:32] Sun Nov 02 01:01:32 PST 2014, offset: -28800000


Case 3: 设置TimeZone为“America/North_Dakota/Center”,设置系统时间为2014-03-09 01:59:00 AM,再运行上面的程序发现


tz: sun.util.calendar.ZoneInfo[id="GMT-06:00",offset=-21600000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
raw offset: -21600000
dstSavings: 0
[2014-03-09 01:59:12] Sun Mar 09 01:59:12 GMT-06:00 2014, offset: -21600000, loader start date: Sun Mar 09 01:59:00 GMT-06:00 2014
[2014-03-09 02:00:12] Sun Mar 09 02:00:12 GMT-06:00 2014, offset: -21600000, loader start date: Sun Mar 09 02:00:00 GMT-06:00 2014
[2014-03-09 02:01:12] Sun Mar 09 02:01:12 GMT-06:00 2014, offset: -21600000, loader start date: Sun Mar 09 02:01:00 GMT-06:00 2014


从结果中可以看到TimeZone ID=GMT-06:00, dstSavings=0,并且在时间从1:59变到2

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python raw_input()和input() 函.. 下一篇Python 日期时间处理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: