Java对中国夏令时的展示

中华人民共和国在1986年~1991年实行了夏令时制度,每年夏令时实行时间如下:

1986年5月4日至9月14日(1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束)
1987年4月12日至9月13日,
1988年4月10日至9月11日,
1989年4月16日至9月17日,
1990年4月15日至9月16日,
1991年4月14日至9月15日。

JDK已有对夏令时的处理

Java的jdk在Date的toString中已经包含夏令时的计算,以下代码可以印证:

public static void main(String[] args) throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String sTime = "1986-09-13 22:00:00";
    sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
    TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
    Date time = sdf.parse(sTime);
    System.out.println(time.getTime());
    System.out.println(time);
    Calendar cd = Calendar.getInstance();
    cd.setTime(time);
    // 2小时以后是几点?
    cd.add(Calendar.HOUR, 2);
    time = cd.getTime();
    System.out.println("------------------------------");
    System.out.println(time.getTime());
    System.out.println(time);
}

打印结果:

527000400000
Sat Sep 13 22:00:00 CDT 1986
------------------------------
527007600000
Sat Sep 13 23:00:00 CST 1986

分析
: 上面代码中1986-09-1322:00:00加上2小时,应该变为1986-09-13 24:00:00(或者1986-09-14 00:00:00),但由于在9月14日零点退出夏令时,时钟向后调整1小时,实际变为1986-09-13 23:00:00。

注意:从9月14日零点退出夏令时,java的Date.toString打印的时区也从CDT恢复为CST( ChinaStandard Time UT+8:00)。

又如:

wujianjun@work ~ $ date
2018年 08月 24日 星期五 19:20:41 CST
wujianjun@work ~ $ date -d @579279600
1988年 05月 11日 星期三 00:00:00 CDT
wujianjun@smzc ~ $ date -d @599587200
1989年 01月 01日 星期日 00:00:00 CST

结论
: 只要是在实行夏令时的时段都是 CDT
时间,其它都是 CST

观点仅代表自己,期待你的留言。

原文 

http://www.wujianjun.org/2018/08/24/cdt-java/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java对中国夏令时的展示

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址