我正在使用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格式时,它会选择转换当地时间。
我错过了什么吗?
答案 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,一切都井然有序。