JS 中 new Date() 踩坑记录

82 篇文章 7 订阅

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/012021-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 (中国标准时间)

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值