2016-11-23 45 views

回答

8

在任何隐约现代的浏览器,你就传递到Date与上年底"Z"

var dt = new Date(yourString + "Z"); 

这个格式是对JavaScript在ES5规范在2009年12月定义的"Z"是重要的确保字符串被解释为UTC,而不是本地时间¹。

Date对象跟踪特定的时刻,而不管时区。如果您使用DateUTC方法(getUTCFullYear,getUTCMonths等),则将以UTC格式访问该时间。 (如果使用非UTC方法,你访问它转换为本地时间)。

例子:

var str = "2016-11-22T17:14:00"; 
 
var dt = new Date(str + "Z"); 
 
console.log("UTC string:"); 
 
console.log(dt.toUTCString()); 
 
console.log("Local string"); 
 
console.log(dt.toString()); 
 
console.log("Hours UTC: " + dt.getUTCHours()); 
 
console.log("Hours local: " + dt.getHours());


¹有一点历史的对此。当格式最初添加到ES5规范时,假设假设是ISO-8601的子集,但ES5规范说没有时区指示符表示UTC,而在ISO-8601中,没有时区指示符表示当地时间。这导致不一致的实现,其中一些是真正的ES5规范,和其他人是真正为ISO-8601。该错误是固定在ES2015规范在2015年六月现在JavaScript的日期/时间格式真的是ISO-8601的一个子集,但JavaScript的Date总是有一个时间成分(一路下降到毫秒的方式),而ISO-8601的概念,即一个值可能只作为特定,因为它是精确的。也就是说,在2016-11-22 JavaScript是一种特定的日期和时间,但在ISO-8601,它只是日期(没有时间是隐含的)。因此,电流(ES2016)JavaScript规范says

当时间区偏移是不存在,日期唯一形式被解释为UTC时间和日期 - 时间形式解释为本地时间。

所以2016-11-22被解释为2016年11月22日午夜(UTC),但2016-11-22T00:00:00在当地时间午夜解释为2016年11月22日。奇怪,但是是真的。当然,在说明书中该最新的语言可能不正确,所有实现来实现,但(我注意到,铬54得到它错了,例如)。

底线:您需要"Z"以确保将字符串解析为UTC。

+0

'Z'使我从我的理解当地时间。当我做新日期('UTC_string')时,我得到一个本地时间对象https://jsfiddle.net/n9aqysq9/ – seroth

+1

@seroth否,Z代表“祖鲁时间”,另一种指UTC + 0000的方式 – Alnitak

+2

@ seroth:正如Alnitak所说,Z意味着UTC。关于你的小提琴:同样,正如我在答案中所说的那样,“Date”实例代表一个时间点,而不考虑时区,它是*如何访问* Date中的数据,以确定您是否在当地时间看到它或UTC。你的小提琴使用默认的'toString',它转换为当地时间。如果您使用'toUTCString'代替,您将获得UTC信息:https://jsfiddle.net/n9aqysq9/1/ –

相关问题