当前位置: 首页 > 知识库问答 >
问题:

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

陆绍辉
2024-01-24

各位好,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 本身的时间戳?

共有2个答案

段干德泽
2024-01-24

在 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); 

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

阎弘雅
2024-01-24

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

image.png

  • 在线时间戳转换工具(Unix timestamp) - 在线工具

只是你在在打印的时候,默认调取了你当前所在的时区,所以显示成了 +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。

 类似资料:
  • 问题内容: 在编写Web应用程序时,将 所有 日期时间(服务器端)存储在数据库中作为UTC时间戳是有意义的。 当我发现您无法在JavaScript中对时区进行操作方面自然无法做到这一点时,我感到非常惊讶。 我稍微扩展了Date对象。这个功能有意义吗?基本上,每次我向服务器发送任何内容时,都会使用该功能格式化时间戳记。 您在这里看到任何重大问题吗?还是从另一个角度解决问题? 在我看来,这有点令人费解

  • 问题内容: 我有一个毫秒本地本地时间戳,我想将其转换为毫秒本地UTC时间戳。快速浏览一下文档,看起来像这样工作: 有一个更好的方法吗? 问题答案: 使用a 来获取本地纪元处的偏移量,然后将其添加到本地纪元时间戳中。

  • 我正在尝试使用Joda在一个简单的Java程序中获取UTC时间戳: 程序输出如下: 毫秒值是正确的UTC时间(即用时区确认)第二个值是时区。 我需要的是UTC值不变为(即独立于TZ),用于数据库写入。这可能吗? 我知道是本地日期(GMT-4),是UTC(GMT-0)。日期的输出值如下: 我尝试了所有组合,试图将的UTC值作为java.sql.TimeStamp: 用于测试的打印输出: 第一行是正确

  • 我想把UTC的时间戳转换成Postgres中的毫秒。我在Ruby控制台上使用这个查询(使用Postgres)。我的问题是: 以上查询结果, 2018年7月5日星期四05:05:39 UTC 00:00至1530767139732.35 输出看起来不错,但在“.”之后我不需要35岁。有没有办法得到13位毫秒的输出。 我会很感激你的帮助。

  • 问题内容: 我正在寻找将UTC时间字符串转换为Unix时间戳的选项。 我拥有的字符串变量是,需要将其转换为unix时间戳,例如 任何想法如何做到这一点? 问题答案: 首先,unix时间戳没有时间,但以UTC为单位。 在包有功能解析与预计解析时的布局。布局是从参考时间开始构造的。因此,在您的情况下,布局应为。使用Parse之后,您将获得一个可以调用Unix来接收Unix时间戳的结构。

  • 问题内容: 我正在使用Python处理日期,因此需要将其转换为UTC时间戳以在中使用。以下代码不起作用: 首先将日期对象转换为datetime也无济于事。我尝试从以下链接获取示例,但: 现在要么: 要么 确实有效。 如此普遍的问题:如何根据UTC将日期转换为自纪元以来的秒数? 问题答案: 如果使用UTC: 如果d在当地时区: timestamp1而timestamp2如果午夜在本地时区是不一样的时