JS 中 new Date() 踩坑记录 您所在的位置:网站首页 一加8手机时间不准 JS 中 new Date() 踩坑记录

JS 中 new Date() 踩坑记录

2024-03-20 15:58| 来源: 网络整理| 查看: 265

JS 中 new Date() 踩坑记录

序言:

这个问题,我也是无意间碰到了,我其实也没想到会出现这种情况,废话不多说,看问题。

new Date()不用多说吧,身为一个前端程序员,应该都知道。

new Date(d)可以传一个特定的日期 d ,然后 new Date()会帮我们把传入的日期转换成一个 时间戳。

> new Date('2021/10/01') > > Fri Oct 01 2021 00:00:00 GMT+0800 (中国标准时间)

OK,接下里,我提出一个问题:

if(new Date('2021/10/01').getTime() === new Date('2021-10-01').getTime()) { console.log('日期相等'); } else { console.log('日期不相等') }

大家认为,会是输出 日期相等 还是日期不相等?

按照 考试的经验来判断 ,一旦试卷上出现这个问题,那肯定就是不相等,没有为什么,直觉而已!但是依照经验判断,new Date() 时我们都传入了一个固定的时间 ‘2021年10月1日’ 这好像并没有什么不同,对于同一个日期,那解析出来的毫秒数应该是一样的。

so,答案是什么?当然是不相等!

为什么?

因为 2021/10/01 和 2021-10-01 之间有差别:一个是 / 分隔,一个 - 分隔。

而正是因为分隔符的不同,导致了我们new Date(d).getTime() 时得出来的毫秒数不同。

差了多少呢? 两者相差 28,800,000毫秒 ,也就是 8个小时。

直观感受一下:

> new Date('2021/10/01') > Fri Oct 01 2021 00:00:00 GMT+0800 (中国标准时间) > new Date('2021-10-01') > Fri Jan 01 2021 08:00:00 GMT+0800 (中国标准时间)

看出来了吗?一个是 00:00:00一个是08:00:00

所以又来了,为什么? 为什么是8点和0点呢?

那是因为 GMT 标准是以 零时区 0 点来计算的,而且我们看到 我们在 new Date() 出来的时间戳后缀都会加上(中国标准时间),中国标准时间就是北京时间呗,北京在哪?东八区,零时区 0点,在东八区就是 8点。

所以啊,问题本质,就在于 js 在解析日期字符串时,对于不同的分隔符,使用了不同的 规则。

那么,有什么解决方案吗?

有,比如强行指定时间:

> new Date('2021-10-01 00:00:00') > > Fri Oct 01 2021 00:00:00 GMT+0800 (中国标准时间)

在比如:

统一分隔符,最简单。

而且啊,’ - '分隔的日期字符串,在 IOS 设备上支持的好像并不友好。

所以,以后搞时间,不要用那么多花里胡哨的方式,简简单单' / '分隔,能避免好多问题。

后记

哈哈哈哈哈,先笑为敬,是本人眼界窄了,原来new Date()这两种也不一样:

> new Date('2021-09-01') > > Fri Oct 01 2021 08:00:00 GMT+0800 (中国标准时间) > > > new Date('2021-9-1') > > Fri Oct 01 2021 00:00:00 GMT+0800 (中国标准时间) > > > new Date('2021/09/01') > > Fri Oct 01 2021 00:00:00 GMT+0800 (中国标准时间) > > > new Date('2021/9/1') > > Fri Oct 01 2021 00:00:00 GMT+0800 (中国标准时间)

不过还是那句话,推荐使用 /,格式统一。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有