专栏首页烟草的香味js new Date() 默认是8点

js new Date() 默认是8点

起因

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

// 假设当前时间是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上不识别中横线分割的时间字符串问题,讲中横线转成了反斜杠。

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

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的兼容问题。

动手解决:

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

本文分享自微信公众号 - 烟草的香味(hujing-bc),作者:胡靖哥哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据结构之跳表

    线性表中的链表是我们都很熟悉的结构了, 链表的增删优于数组, 但是不支持随机访问, 链表在查找时, 只能从头节点向后遍历, 那么针对链表, 能不能解决其访问效率...

    烟草的香味
  • JVM内存结构

    按照Java虚拟机规范的规定, JVM自动管理的内存将包括以下几个运行时的数据区域:

    烟草的香味
  • 23种设计模式之装饰模式

    定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活.

    烟草的香味
  • 求解析,为什么差距这么大,难道就是因为一叶障目不见泰山了吗~~~

    WolframChina
  • [答疑]财务打款流程活动图

    用户6288414
  • 阿里P7架构师总结分布式系统的经典基础理论

    首先,分布式系统的首要目标是提升系统的整体性能和吞吐量。如果最终设计出来的分布式系统占用了10台机器才勉强达到单机系统的两倍性能,那么这个分布式系统还有存在的价...

    美的让人心动
  • 阿里P7架构师总结分布式系统的经典基础理论

    美的让人心动
  • 火星坐标拾取工具

    在国内必须至少使用GCJ-02的坐标系,而GCJ-02,“火星坐标”是在国内最广泛使用的坐标体系。那么,我们就来看看,如何直接获取到GCJ-02坐标呗。 请大...

    麦克劳林
  • Django Web开发技术栈清单-P

    Python和其他语言最大的区别就是使用行和缩进,而不是大括号({})或者分号(;)来控制类、函数或者逻辑判断。Python使用换行来表示语句的结束。但同时可以...

    py3study
  • Pandas-DataFrame基础知识点总结

    1、DataFrame的创建 DataFrame是一种表格型数据结构,它含有一组有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看...

    石晓文

扫码关注云+社区

领取腾讯云代金券