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

Javascript Unix格式的GMT/UTC(非本地)时间,javascript,unix,time,utc,gmt,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 = da

我正在使用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格式获取本地时间

您可以在此处实时运行它: (也在pastebin上:)

这是一个输出示例:

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格式时,它会选择转换我的本地时间


我遗漏了什么吗?

是的,你的问题颠倒了

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

因此,您的两个Javascript代码片段以一种简单的方式和一种冗长复杂的方式找到了相同的正确答案(当前的“unix时间”是多少?),这就是为什么它们给出了相同的结果

。。。date命令是区域设置敏感的。在您的区域设置中,您有一个2小时的偏移量,因此它假定您的日期字符串有一个2小时的偏移量。您可以通过使用-u标志告诉它不要这样做,这意味着您保证字符串在UTC时间内

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

首先,正如@tialaramex已经指出的,两个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,请注意,
日期
输出与您的不同

更新:根据下面注释中@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

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

好吧,你只需要指定
日期的时区,例如
date-d“2012-01-30 21:15:19+0000”+%s
date-d“2012-01-30 21:15:19 UTC”+%s
,以及
date-u-d“2012-01-30 21:15:19 Z”
所有工作。欢迎您的回答。@derobert:我怀疑一定有办法将时区指定为
日期
,谢谢!我更新了我的答案。所以,让我直说吧。当我告诉JavaScript解释器将字符串“2012-01-30 23:15:19+0200”转换为Unix时间时,它首先看到它应该是“2012-01-30 21:15:19+0000”,然后将其转换为1327958119,对吗?
$ 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