Unix格式的GMT / UTC(非本地)时间

时间:2012-01-30 21:50:29

标签: javascript unix time utc gmt

我正在使用JavaScript并试图以Unix格式获得GMT + 0 / UTC + 0时间(其他称为Zulu时间)。

我设法以Unix格式获取当地时间:

var datetime = new Date()
var unixtime = Math.floor(Number(datetime/1000));

但是当我尝试用UTC时间做同样的事情时......

var datetime = new Date()
var year = datetime.getUTCFullYear()
var month = datetime.getUTCMonth()
var day = datetime.getUTCDate()
var hours = datetime.getUTCHours()
var minutes = datetime.getUTCMinutes()
var seconds = datetime.getUTCSeconds()
var unixtime = (Date.UTC(year,month,day,hours,minutes,seconds,00)/1000);

失败了。我只是以Unix格式获得当地时间。

您可以在此处直播:http://jsfiddle.net/wC8XH/1/ (还有关于pastebin:http://pastebin.com/uDD5zUah

这是输出的一个例子:

2012-01-30 23:15:19 = 1327958119
2012-01-30 21:15:19 = 1327958119

这样做的:

date -d "2012-01-30 21:15:19" +%s
在Linux上的

给了我1327950919,而不是1327958119.差异是7200秒,这是2小时,这是我的时区(+0200)。

所以如果我只想要人类可读的格式,那么我可以获得UTC + 0时间,但是当我请求Date.UTC将其转换为Unix格式时,它会选择转换当地时间。

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

是的,你的问题是颠倒的。

Javascript 始终告诉您“Unix格式”中UTC或GMT的秒数。因为Unix总是在UTC或GMT内部工作。如果没有UTC,那么谈论“Unix时间”是没有意义的。

所以你的两个Javascript代码片段找到了相同的正确答案(当前的“unix time”是什么?)以简单的方式和非常冗长的复杂方式,这就是为什么它们给出相同的结果。

...而且date命令对区域设置敏感。在您的语言环境中,您有2小时的偏移量,因此它假定您的日期字符串具有2小时的偏移量。您可以通过使用-u标志告诉它不要这样做,这意味着您承诺您的字符串是UTC时间。

以下是一些示例,通过设置TZ环境变量,可以更改提供的字符串的明显时区(显示的TZ值适用于常见的Unix时区文件,特定系统上可用的名称可能会有所不同)。 / p>

$ TZ="America/New_York" date -d "2012-01-30 21:15:19" +%s
1327976119
$ TZ="Europe/Paris" date -d "2012-01-30 21:15:19" +%s
1327954519
$ date -u -d "2012-01-30 21:15:19" +%s
1327958119

答案 1 :(得分:2)

首先,正如 @tirameramex 已经说明的那样,两个JavaScript代码段都是正确的,所以你应该选择更短的代码片段。

问题在于Linux date命令。当您传递日期时,它会在您当前的时区解释它,而不是UTC!看:

$ date -d "2012-01-30 21:15:19" +%s
1327954519
$ scala
scala> new java.util.Date(1327954519 * 1000L)
res0: java.util.Date = Mon Jan 30 21:15:19 CET 2012

我住在CET,注意date输出与你的不同。

更新:根据评论中的 @derobert 的强烈建议,您可以在调用date时明确指定时区:

$ date -d "2012-01-30 21:15:19+0000" +%s
1327958119
$ scala
scala> new java.util.Date(1327958119 * 1000L)
res0: java.util.Date = Mon Jan 30 22:15:19 CET 2012

21:15在UTC是22:15 CET,一切都井然有序。