前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js new Date() 默认是8点

js new Date() 默认是8点

作者头像
烟草的香味
发布2019-12-31 13:02:29
8.8K0
发布2019-12-31 13:02:29
举报
文章被收录于专栏:烟草的香味烟草的香味

起因

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

代码语言:javascript
复制
// 假设当前时间是2019年12月22日0点20分
new Date('2019-12-22').getTime() < new Date().getTime()
// 上面的结果是什么?正常来说应该是true吧,但不好意思啊,返回了false

百思不得其解,当时因为情况紧急,查出了上面的创建时间返回的内容并不是0点,而是8点

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

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

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

代码语言:javascript
复制
new Date('2019/12/22 00:00:00').getTime() < new Date().getTime()

临时解决问题。现在闲来无事,可以看看这个问题究竟是什么鬼?

尝试

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

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

探究

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

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

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

解决

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

动手解决:

代码语言:javascript
复制
/**
 * 将时间字符串转换成date对象
 * @param dateStr
 * 时间字符串
 */
function getDate(dateStr){
    /* 若日期是使用-分割的,全部转换成/
            因为只有日期时,js会将-分割的字符串基准时区设置为GMT,与当前时区相差8小时 */
    dateStr = dateStr.replace(/-/g, '/');
    return new Date(dateStr);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 起因
  • 尝试
  • 探究
  • 解决
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档