【问题标题】: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,晚了一个小时。

【问题讨论】:

    标签: javascript date node.js timestamp


    【解决方案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
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 1970-01-01
          • 2018-06-15
          • 1970-01-01
          • 2013-02-05
          相关资源
          最近更新 更多