为啥我的 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 时我的不和谐机器人无法上线?