前言
最近在和app客户端对接一些功能,使用new Date转换把时间戳转换后在不同的手机得到点数不一样的问题,分别出现CDT、CST,一脸懵逼情况下,我决定趁此机会好好把这几个概念理一下。
Date对象
Date是一个对象类型,只能通过调用 Date 构造函数来实例化日期对象:以常规函数调用它(即不加 new 操作符)将会返回一个字符串,而不是一个日期对象。另外,不像其他JavaScript 类型,Date 对象没有字面量格式。
Date对象的主要方法
1 | // 该方法传递的是国际标准时间 |
更多关于Date的方法请参考Date.
关于时区的概念
时区
全球划分为24个时区,分别有:
EDT -04:00 东部夏时制
CDT -05:00 中部夏时制
EST -05:00 东部标准时间
CST -06:00 中部标准时间
MDT -06:00 山地夏时制
MST -07:00 山地标准时间
…
等等,详细参考时区。
上面的🌰中你是否看到了两个中部时间,其中一个为中部夏时制(CDT),一个为中部标准时间(CST),那么什么是夏时制?
夏时制
夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
中国也曾实行过夏时制,时间为1986-1991。更多关于夏时制的知识请参考夏时制
夏令时导致的问题以及解决方案
问题
从后端获取时间戳,在前端用JS格式化显示。发现再Chrome和sarafi下,对特定的时间段(1986年至1991年),的处理方式并不相同。举个🌰:1
2
3
4
5let timestamp = 676958400000;
// chrome下
new Date(timestamp) // Sat Jun 15 1991 13:00:00 GMT+0900 (CDT)
// safari下
new Date(timestamp) // Sat Jun 15 1991 12:00:00 GMT+0800 (CST)
解决方案
1、尽量避免从后端或者客户端获取时间戳,让他们处理返回格式化后的日期字符串,如1991-06-01 15:00:00;
2、判断时区是否使用夏令时
可用getTimezoneOffset()方法判断时区使用的是否是夏令时。实现这一点需要创建任意年份的1月1日的日期,然后创建该年份的7月1日的日期,比较时区偏移量。如果分钟数不等,说明该时区使用的是夏令时,如果相等,则该时区使用的不是夏令时。1
2
3var d1 = new Date(1991,1,1);
var d2 = new Date(1991,7,1);
var isDST = d1.getTimezoneOffset != d2.getTimezoneOffset();
个人认为方案一更方便合理,方案二的话只是一种思路,具体还有待扩展。
小结
具体关于javascript的Date对象还是博大精深,当然也有各种各样的插件库,比如moment.js、date.js有兴趣的小伙伴可以了解下。