为啥我的 javascript (node.js) 给了我不正确的时间戳?

Posted

技术标签:

【中文标题】为啥我的 javascript (node.js) 给了我不正确的时间戳?【英文标题】:How come my javascript (node.js) is giving me the incorrect timestamp?为什么我的 javascript (node.js) 给了我不正确的时间戳? 【发布时间】:2011-11-20 20:53:39 【问题描述】:

我在控制台中输入了“日期”……我得到了Tue Sep 20 01:01:49 PDT 2011……这是正确的。

但后来我在 node.js 中执行此操作,我得到了错误的时间。

 var ts = String(Math.round(new Date().getTime() / 1000));

输出为:1316505706,晚了一个小时。

【问题讨论】:

【参考方案1】:

@KARASZI 关于根本原因是绝对正确的:除非您对其进行操作,否则 Unix 时间戳始终是 UTC。我建议如果您想要一个 Unix 时间戳,您应该将其保留为 UTC,并且仅当您需要向用户显示格式化时间时才转换为本地时间。

这样做的第一个好处是您的所有服务器可以同时“说话”。例如,如果您已将服务器部署到 Amazon EC2 US East 和 Amazon EC2 US West,并且它们共享一个公用数据库,则您可以在数据库和服务器上使用 UTC 时间戳,而不必担心每次都转换时区。这是使用 UTC 时间戳的一个很好的理由,但它可能不适用于您。

这样做的第二个好处是,您可以根据经过的时间来衡量事物,而不必担心夏令时(或时区,以防您在移动的平台上测量时间!)。这不会出现太多,但是如果您遇到由于本地时间在您测量时“回落”一小时而导致某些事情花费负时间的情况,您会非常困惑!

我能想到的第三个原因非常小,但一些性能极客会非常感激:通过使用 Date 类的“now”函数,您无需每次都分配新的 Date 对象即可获得原始 UTC 时间戳。

var ts = Date.now() / 1000;

【讨论】:

【参考方案2】:

原因是getTime函数返回的是UTC时区的时间:

getTime 方法返回的值是自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。您可以使用此方法帮助将日期和时间分配给另一个 Date 对象。

如果要获取当前时区的 UNIX 时间戳,可以使用 getTimezoneOffset 方法:

var date = new Date();
var ts = String(Math.round(date.getTime() / 1000) + date.getTimezoneOffset() * 60);

【讨论】:

【参考方案3】:

请注意,您可以通过使用 node.js 包(如 timezonecomplete 或 timezone-js)来避免这种混淆,这些包的接口对于日期和时间操作来说更不容易出错。

【讨论】:

【参考方案4】:

date在控制台会返回服务器时间,而在网页上使用javascript会返回客户端的本地时间。

【讨论】:

我用的是node.js,所以是服务器javascript

以上是关于为啥我的 javascript (node.js) 给了我不正确的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 node.js discord.js 机器人不发送文件? (没有错误)(可以发送消息)

为啥我的 cpanel 没有在软件中显示设置 node.js 应用程序图标?

为啥我的 Flask 应用程序在 Heroku 上被检测为 node.js

为啥当我输入 node main.js 时我的不和谐机器人无法上线?

为啥我的 Auth0 令牌从 iOS 发送到 node.js 服务器时总是返回无效?

为啥我又从 Node.js 回到 Python