nodejs 中 UTC 时间戳转化的问题?

各位好,koa/nodejs 中获取 UTC 时间,并转化为时间戳,我通过下面的代码实现的

const UTC = new Date().toUTCString();
console.log(UTC);
const UTCtimestamp = Date.parse(UTC);
console.log(UTCtimestamp);

现在的问题是,能够正确的打印出 UTC 即 UTC0 的时间,但在转化成时间戳后,却变成了本地时间的时间戳。

比如 UTC 是 Wed, 24 Jan 2024 06:02:07 GMT
但转化后的时间戳却是 1706076127000

自动 +8 了,请问该怎么不自动转化,而是显示 UTC0 本身的时间戳?

阅读 1.6k
2 个回答

别把自己搞晕了,正因为 toUTCString 的返回结果里面的 GMT 标识存在,你获取的到的已经是 UTC 时间戳了。

image.png

只是你在在打印的时候,默认调取了你当前所在的时区,所以显示成了 +8 的让你感到疑惑。

以你的例子来说,如果你去掉了 Wed, 24 Jan 2024 06:02:07 GMT 里面的 GMT ,改为 Wed, 24 Jan 2024 06:02:07,你就会发现,他是按照你当前时区格式化获取出来的时间戳了,这才有问题。

时间戳记录了的是从 UTC 0 的 1970年1月1日0时0分0秒 到当前的秒(毫秒),换成国内的时区,就是从 1970年1月1日08时0分0秒 开始的了。

所以你在真实时区 +8 和 +0 上获取的同一时间的时间戳都是一样的。

只是在 +8 时区上,想要处理一个 +0 时区的字符串时,需要注意,因为有可能这个字符串被当成当前时区的处理的。换句话说,你在 +0 时区的 2024/01/01 00:00:00 是等于 +8 时区的 2024/01/01 08:00:00 的。但是你在 +0 时区的 2024/01/01 00:00:00 可不等于 +8 时区的 2024/01/01 00:00:00。

新手上路,请多包涵

在 Node.js 中,当你使用 new Date().toUTCString() 获取 UTC 时间字符串后,再通过 Date.parse(UTC) 来解析这个字符串,JavaScript 会根据系统的本地时区来解析该字符串,即使它是一个 UTC 字符串。

正确的做法是直接从原始的 UTC 日期对象获取时间戳,而不是先转换为字符串再解析。这样可以避免任何时区相关的混淆:

const date = new Date();
// 设置日期对象为 UTC 时间
date.setUTCHours(date.getUTCHours());
date.setUTCMinutes(date.getUTCMinutes());
date.setUTCSeconds(date.getUTCSeconds());
date.setUTCMilliseconds(date.getUTCMilliseconds());

// 获取 UTC 时间戳(毫秒级)
const UTCtimestamp = date.getTime();

console.log(date.toUTCString());
console.log(UTCtimestamp); 

点点关注查看更多干货内容

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题