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 (中国标准时间)
不过还是那句话,推荐使用 /
,格式统一。