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

我在控制台中input“date”,我得到Tue Sep 20 01:01:49 PDT 2011 …这是正确的。

但是我在node.js中这样做,我得到了错误的时间。

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

输出是:1316505706,这是一个小时的时间。

@KARASZI对于根本原因是绝对正确的:Unix时间戳总是UTC,除非你操纵它们。 我build议,如果你想要一个Unix时间戳,你应该把它留在UTC,只有转换为本地时间,如果你需要显示一个格式化的时间给用户。

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

这样做的第二个好处是,您可以根据经过的时间来衡量事情,而无需担心夏令时(或时区,以防您正在移动的平台上测量时间)。 这个不怎么样,但是如果你遇到了一些因为当地时间在你测量的时候“倒退”了一些负面的时间,你会感到非常困惑!

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

 var ts = Date.now() / 1000; 

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

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

如果您想在当前时区获取UNIX时间戳,则可以使用getTimezoneOffset方法:

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

注意,你可以通过使用像timezonecomplete或timezone-js这样的node.js包来避免这种混淆,这些包的接口在date和时间操作方面的错误更less。

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