JS 中 new Date() 参数为字符串时引发的问题

起因

在使用 date 对象时,意外发现了这样一个问题;

 console.log(new Date('2021-05-09').getTime()); // 1620518400000
 console.log(new Date('2021-5-09').getTime());  // 1620489600000

是的,明明是相同的时间,为何获得的毫秒数却不同呢?

分析

 console.log(new Date('2021-05-09')); // Sun May 09 2021 08:00:00 GMT+0800 (中国标准时间)
 console.log(new Date('2021-5-09'));  // Sun May 09 2021 00:00:00 GMT+0800 (中国标准时间)
 ​
 ​
 // 以下是个人的分析(错了别打我)
 ​
 // 2021-05-09 被 javascript 认定为是,UTC 世界时,即 英国格林威治时间 5/9 0:00 (此时,对应北京时间是 5/9 8:00) 2021-05-09 00:00:00 GMT+0000
 // 当 Date 对象获取本地时区,得知此时开发人员位于 东八区,
 // 便将 2021-05-09 解析为东八区的时间,即北京时间 5/9 8:00 ,于是便有了下面的输出
 // Sun May 09 2021 08:00:00 GMT+0800 (中国标准时间)
 ​
 // 而 2021-5-09 被 javascript 认定为是,北京时间 5/9 0:00
 // Date 对象获取本地时区后,便直接输出了
 // Sun May 09 2021 00:00:00 GMT+0800 (中国标准时间)

破案了破案了 (看来分析的没啥大问题 ... ,为啥我不早点去看 MDN ,可恶啊)

MDN 中给出了详细的解释 Date - JavaScript | MDN (mozilla.org)

new Date()

参数

时间戳字符串 dateString

表示日期的字符串;该字符串应该能被 Date.parse() 正确方法识别(即符合 IETF-compliant RFC 2822 timestampsversion of ISO8601);

注意: 由于浏览器之间的差异与不一致性,强烈不推荐使用Date构造函数来解析日期字符串 (或使用与其等价的Date.parse()

对 RFC 2822 格式的日期仅有约定俗称的支持;

对 ISO 8601 格式的支持中,仅有日期的字符串 (例如 "1970-01-01") 会被处理为 UTC 而不是本地时间,与其他格式的字符串处理方式不同;

解决办法

 // 1、在日期字符串后,加上时区,告诉 js 我这个日期是东八区
 // 例子:
 console.log(new Date('2021-05-09 UTC+0800'));
 // Sun May 09 2021 00:00:00 GMT+0800 (中国标准时间)
 console.log(new Date('2021-05-09 GMT+0800'));
 // Sun May 09 2021 00:00:00 GMT+0800 (中国标准时间)
 ​
 // 2、加上 00:00:00,js 就会认定为时 本地时区;
 // 例子:
 console.log(new Date('2021-05-09 00:00:00'));
 // Sun May 09 2021 00:00:00 GMT+0800 (中国标准时间)
 ​
 // 3、使用 Moment.js (JavaScript 日期处理类库)
 moment('2019-10-10').toDate()
 // Thu Oct 10 2019 00:00:00 GMT+0800 (中国标准时间)
 moment('2019-10-10 00:00:00').toDate()
 // Thu Oct 10 2019 00:00:00 GMT+0800 (中国标准时间)

其他补充

Date中保存的是什么

Date 对象里存的只是一个 long 型的变量;其值是自格林威治时间( GMT)1970年1月1日0点至 Date 对象所表示时刻所经过的毫秒数;

调用 Date 对象的方法时,它会根据你所在的时区,返回你当前时区对应的数据;

更多详情可参考此文章:https://blog.csdn.net/halfclear/article/details/77573956

 

三种获取时间戳方式的区别

性能不同,以下是测试代码;

 console.time('+new Date()')
 for (var i = 0; i < 650000; i++) {
     var o = + new Date()
 }
 console.timeEnd('+new Date()')
 ​
 console.time('new Date().getTime:')
 for (var j = 0; j < 650000; j++) {
     var p = new Date().getTime();
 }
 console.timeEnd('new Date().getTime:')
 ​
 console.time('Date.now()')
 for (var k = 0; k < 650000; k++) {
     var q = Date.now()
 }
 console.timeEnd('Date.now()')
 ​
 // +new Date(): 252.239013671875 ms
 // new Date().getTime(): 179.94384765625 ms
 // Date.now(): 97.277099609375 ms
  1. 结论:+new Date()) > new Date().getTime() > Date.now()

  2. +new Date()) 用时最多,因为它涉及数据类型转换,转换为 number 数据类型;

  3. Date.now() 用时最少,因为它是通过 constructor 的属性获取时间戳;

  4. new Date().getTime()是通过 constructor.prototype 的属性获取;显然实例化对象更花的时间;

 

over

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值