2017-04-09 19 views
1
var start = new Date("2017-04-09T21:00:00"); 

輸出:星期一2017年4月10日05:00:00 GMT + 0800(+08)新加入的日期( 「」)GMT小時

它假設是:太陽2017年4月9日21:00: 00 GMT + 0800(+08)

+3

遠程'T'從' 「2017-04-09T21:00:00」' – gurvinder372

+0

但是我使用FullCalendar比它做工精細,而把日期用'T'。 – User1911

+0

start.toUTCString(); ? – ThatAwesomeCoder

回答

1

這很容易。你可以試試這個:

var start = new Date("2017-04-09T21:00:00"); 
 
start.setTime(start.getTime() + start.getTimezoneOffset()*60*1000); 
 

 
console.log(start);

+0

除了'新日期(「2017-04-09T21:00:00」)'在不同的瀏覽器中返回不同的結果。對於我而言,在Firefox 49中,上述內容返回「2017-04-09T01:00:00.000Z」。在Safari中,它返回「2017-04-09T11:00:00.000Z」。根據ECMA-262,它應被視爲本地的,因此不需要對當地時區進行調整。 – RobG

+0

在firefox中,當您將參數傳遞給Date()構造函數時,將其視爲本地時間並返回格林威治標準時間。但是,在Chrome中,參數被視爲格林威治標準時間並返回當地時間。因此,您需要檢測瀏覽器並根據此計算時間(輸出)。但我不明白爲什麼Safari會返回意想不到的結果。 –

+0

如果你走向瀏覽器嗅探的道路,你就處於一個痛苦的世界。只需手動解析字符串。 – RobG

0

有一個黃金法則,你不應該解析與Date構造函數的字符串(或Date.parse,它們是等價的解析)。

ECMA-262,沒有一個時區的ISO 8601格式的日期應被視爲本地:

當時間區偏移量不存在,日期只有形式解釋 爲UTC時間和日期 - 時間表被解釋爲當地時間。

因此new Date("2017-04-09T21:00:00")應在宿主時區返回2017年4月9日晚上9:00的日期。

但是,Safari 10和Chrome 57中的測試顯示「2017-04-09T21:00:00」被視爲Z或GMT + 0000。 Firefox 49奇怪地將它視爲UTC,然後以錯誤的方式調整當地時區。但是,Firefox 38正確地將其視爲本地。

所以總是手動解析字符串。使用庫或寫一個簡短的功能,例如

// Parse 2017-04-09T11:00:00.000 as local 
 
function parseISOLocal(s) { 
 
    var b = s.split(/\D/); 
 
    return new Date(b[0], b[1]-1, b[2], (b[3]||0), 
 
       (b[4]||0), (b[5]||0), (b[6]||0)); 
 
} 
 

 
var s = '2017-04-09T21:00:00.000'; 
 
console.log('Built-in parser: ' + new Date(s).toString()); 
 
console.log('parseISOLocal : ' + parseISOLocal(s).toString());