起因
在使用 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 timestamps 或 version 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
-
结论:
+new Date())
>new Date().getTime()
>Date.now()
; -
+new Date())
用时最多,因为它涉及数据类型转换,转换为 number 数据类型; -
Date.now()
用时最少,因为它是通过constructor
的属性获取时间戳; -
new Date().getTime()
是通过constructor.prototype
的属性获取;显然实例化对象更花的时间;
over