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

GMT/UTC (not local) time in Unix format

本文关键字:时间 UTC 格式 GMT Unix      更新时间:2023-09-26

我正在使用JavaScript,并试图获得Unix格式的GMT+0/UTC+0时间(也称为祖鲁时间)。

我已经设法用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/(同样在粘贴箱上: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格式时,它会选择转换我的本地时间。

我是不是错过了什么?

是的,问题颠倒了。

Javascript总是以UTC或GMT的形式告诉您"Unix格式"中的秒数。因为Unix总是在UTC或GMT内部工作。如果不使用UTC来谈论"Unix时间"是没有意义的。

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

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

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

$ 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

首先,正如@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,注意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是欧洲中部时间22:15,一切正常。