说说Java中的TimeZone夏令时问题

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

原来链接:说说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

扫描二维码关注公众号,回复: 4100958 查看本文章
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: -28800000dstSavings: 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: -28800000dstSavings: 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: -21600000dstSavings: 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:00的时候时间并没有向后调整到3:00 ,这说明Java没有找到对应的时区信息(也许这是Java的一个bug),所以Java就不知道当前这个时区是不是使用了夏令时,所以最终导致取得的时间不对。


对于这类问题,可以通过下面两个方法解决

1. 使用TZ环境变量,然后在运行Java程序

$ export TZ=America/North_Dakota/Center$ java TimeZoneTest

2. 使用-Duser.timezone=America/North_Dakota/Center作为Java虚拟机的系统参数

java -Duser.timezone=America/North_Dakota/Center TimeZoneTest

另外,可以通过下面的一些命令查看系统的timezone信息

cat /usr/share/zoneinfo/zone.tabzdump /usr/share/zoneinfo/*zdump -v /usr/share/zoneinfo/America/New_York 查看夏令时时间变化点zdump -v /etc/localtimetz_convert /usr/share/zoneinfo/sudo cat /etc/sysconfig/clock


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mm2zzyzzp/article/details/84136950
今日推荐