js new Date 建立时间默认是8点

 

原由

最近在写一个页面,须要用到时间控制。而后我经过new Date()传入日期字符串建立了一个对象,并与当前时间作时间戳比较,结果12点刚过,就出问题了。举个栗子spa

// 假设当前时间是2019年12月22日0点20分
new Date('2019-12-22').getTime() < new Date().getTime() // 上面的结果是什么?正常来讲应该是true吧,但很差意思啊,返回了false

 

百思不得其解,当时由于状况紧急,查出了上面的建立时间返回的内容并非0点,而是8点code

因此就强行在时间字符串上拼接了时间:new Date('2019-12-22 00:00:00').getTime(), 强行解决了这个问题。对象

而后又碰到了在IOS上不识别中横线分割的时间字符串问题,讲中横线转成了反斜杠。blog

当时临时解决问题后的字符串大概长这样:字符串

new Date('2019/12/22 00:00:00').getTime() < new Date().getTime()

临时解决问题。如今闲来无事,能够看看这个问题到底是什么鬼?get

尝试

传入不一样的字符串格式,看看结果,我只尝试了最常使用的两种格式io

惊讶的发现,-分割的字符串,被默认解析到了8点,而/分割的字符串,默认解析到了0点。这么说来,我以前有点屡次一举了,直接讲-替换成/就能够了啊。function

探究

那么为何默认是8点呢?有没有以为8这个数字很值得关注,咱们所在的时区是东八区,若是以GMT标准0点来算的话,在那个时间点,这里就是8点啊。class

那我就能够这样理解了,建立时间时,它默认时间确实是0点,可是是以GMT为基准的,因此将其转换成本地时间就是8点。而/分割的字符串在建立时,则是以本地时区为基准。date

那么为何js会对不一样分割的时间字符串进行不一样处理呢?貌似是由于-分隔且具备前导0的日期字符串,会被解析成ISO格式的字符串,以GMT时区为基准,不过我也没看懂。

解决

最终,既然-分割的字符串会出问题,那我就讲全部的-都换成/就行了,正好也能够借此解决IOS的兼容问题。

动手解决:

/** * 将时间字符串转换成date对象 * @param dateStr * 时间字符串 */
function getDate(dateStr){ /* 若日期是使用-分割的,所有转换成/ 由于只有日期时,js会将-分割的字符串基准时区设置为GMT,与当前时区相差8小时 */ dateStr = dateStr.replace(/-/g, '/'); return new Date(dateStr); }
相关文章
相关标签/搜索