时间处理夏令时之谜


title: 时间处理夏令时之谜 tags:

  • CDT
  • DST
  • 夏令时
  • Java
  • JS categories: 工作日志 date: 2017-09-01 12:08:29

背景

关于时间,闰秒大家可能都知道会对系统有很重大的影响。但是对于一个特殊情况(夏令时)也会对系统产生较大的影响。

有个小伙伴问了如下的问题

分析

  1. 初步考虑是时区的问题,不过考虑系统是中国人在使用,我过都是GMT+8,想来也很难出现故意设置其他时区
  2. 于是在js console中执行如下 出现了很奇怪的现象(三幅图分别为chrome61 , firefox55 , Safari10.1.2)
  3. 其中chrome或者firefox均出现了奇怪GMT+0900(CDT) 很明显这个时间不是“北京时间”,那么问题出现在哪呢?
  4. 先check一下CDT是啥(CDT – Central Daylight Time / Central Daylight Saving Time (Daylight Saving Time))夏令时
  5. 我国大部分银行和政务机构都实施了夏令时工作时间(比如夏天下午三点上班~)但是实质上我国并没有夏令时
  6. 确认我国曾经实行过夏令时baike.baidu.com/item/%E5%A4…

夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。

1986年4月,中央有关部门发出“在全国范围内实行夏时制的通知”,具体作法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行。

原来如此,那么从逻辑上来说我国并没有 1986-05-04 02:00:01 但是有两个1986-09-14 02:00:00(大家可以类推)原来我国还有这样的过去……

那么对于有夏令时的国家来说(比如澳洲,巴西等等)可能会出现某些用户有两个一样的时间或者缺少一段时间(发展国际客户需要注意,互联网应用尤其注意

那么Safari为啥显示的是依然是CST呢?大概是个bug吧 比如有人反映fullcalendar在Safari时间有误 Selection bug when DST in Australia in Safari Mac

说了这么久,问题如下 夏令时完全是政府公布的政策,那么操作系统或者其他开发语言如何获取变更呢?

Windows通过系统更新来推送support.microsoft.com/zh-cn/help/…

JavaScript应该和不同浏览器厂商实现有关,通常随着浏览器版本更新可以更新新的夏令时信息或者读取操作系统更新(?未调查)(旧的数据通常是准确的,假设突然我国在2018年宣布进入夏令时……)

Java是和JRE发布有关,比如所有的时区信息等存储在

这个问题在Oracle也提到了 www.oracle.com/technetwork…

需要维护数据www.twinsun.com/tz/tz-link.…

也可以通过TZUpdater更新数据

Safari 不支持直接传入如上格式字符串

这是个有趣的问题~

关于javascript的夏令时问题有兴趣的小伙伴可以自己尝试以及找到差异~

你可能感兴趣的:(时间处理夏令时之谜)