2016-11-23 49 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/ –

相關問題