js getTime()后的时间戳多出8小时,如何兼容?

本来想着根据当前时间戳获取当日0点的时间戳

let d = new Date()
let todayStart = new Date(d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() +' 00:00:00z').getTime()
let todayStart1 = d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() +' 00:00:00z'
let todayStart2 = d.setHours(0, 0, 0, 0)

打印结果:
1677715200000
2023/3/2 00:00:00z
1677715200000

我去转了一下1677715200000 =》 2023-03-02 08:00:00
多了8个小时

这个需要如何处理这个时间戳才是正确的0点的时间戳
运行环境是云函数 所属时区是utc+0
查了半天搞不定了

阅读 2.7k
2 个回答

获取当前UTC时间,然后根据UTC时间计算北京时间
你要

let todayStart = new Date(d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() +' 00:00:00z').getTime()-new Date().getTimezoneOffset()

如果就要当天零点

let time = new Date(new Date().toLocaleDateString())

这样写就可以了

浏览器使用的始终是本地时间,new Date().getTimezoneOffset() 可以拿到 UTC 时间和本地时间的时间差。问题是不能简单的使用 new Date() 来生成新的时间对象,因为这个对象理论上来说还是一个本地时间,加了时差之后会成为一个看起来是 UTC 时间的本地时间……

由于浏览器没有 UTC 时间表示,所以应该处理成字符串,只需要

new Date(1677715200000).toISOString().slice(0, 10)
// 2023-03-02

如果要保留时间部分,去掉 slice() 截取处理就行了。

参阅:javascript - 考虑时区了吗? - 边城客栈 - SegmentFault 思否

推荐问题
宣传栏