为啥我的 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 没有原生 DOM?

Node.js - 为啥我的一些回调没有异步执行?

为啥异常会导致 Node.js 中的资源泄漏?

为啥 Node.js 通常使用 'var' 而不是 'let'?

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

为啥需要node js,啥是框架