2015-11-04 107 views
2

我在轉換當前timzone中的datetime時遇到了問題。Javascript轉換時區問題

我收到服務器的這個日期字符串格式爲「2015-10-09T08:00:00」這是中央時間,但當我在GMT + 5中使用新日期(strDate)轉換此日期時間時,它將我返回給我在下面是不正確的。

var dateObj = '2015-10-09T08:00:00'; 
new Date(dateObj); // return me below 
Fri Oct 09 2015 13:00:00 GMT+0500 (PKT) 

另一種方式我用的是加區偏移量和它的返回我正確的結果,但是當夏令激活挑釁無法轉換。

dateObj2 = '2015-10-09T08:00:00'+'-06:00'; 
new Date(dateObj2)// return me below 
Fri Oct 09 2015 19:00:00 GMT+0500 (PKT) 

我很感激,如果有人幫助或建議我有效的方式來處理時區轉換與夏令時在JavaScript中?

謝謝。

+0

如果你不反對使用庫:http://momentjs.com/timezone/ – Manube

+0

@Manube感謝您的建議,我會嘗試任何線索在純JavaScript。 –

+1

在普通的js中,我認爲這很棘手,因爲你的應用需要根據時區知道夏令時;所有這些都經過深思熟慮,並由當時的時區庫 – Manube

回答

1

注意代碼的這種行爲你寫的瀏覽器之間的不同:

new Date('2015-10-09T08:00:00').toString() 

// "Fri Oct 09 2015 10:00:00 GMT+0200 (Romance Daylight Time)" // Chrome 46 on Windows 8.1 
// "Fri Oct 09 2015 08:00:00 GMT+0200 (Romance Daylight Time)" // Firefox 41 on Windows 8.1 
// "Fri Oct 09 2015 08:00:00 GMT+0200 (Romance Daylight Time)" // IE11 on Windows 8.1 
// "Fri Oct 9 08:00:00 UTC+0200 2015" // IE10 emulation 
// "Fri Oct 9 10:00:00 UTC+0200 2015" // IE9 emulation 
// on IE8 it even returns NaN! 

(我的時區是巴黎)

因此,Firefox和IE瀏覽器解釋爲規定就好像它是在提供的日期用戶的本地時區,而Chrome將其解釋爲UTC,並在打印時將其轉換爲用戶的時區。

檢查MDN文檔,這是由於EcmaScript 5和EcmaScript 6(2015)規格的差異。 Chrome似乎遵循ES5規範,而Firefox和IE11遵循ES6規範。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#ECMAScript_5_ISO-8601_format_support(重點煤礦)

的日期時間字符串可在ISO 8601的格式。例如, 「2011-10-10」(剛剛日期)或「2011-10-10T14:48:00」(日期和時間)可以傳遞並解析 。 UTC時區用於解釋ISO 8601格式的參數 (不包含時區信息)(注意 ECMAScript 2015指定日期時間字符串沒有時間 區域將被視爲本地而不是UTC)。

不幸Date對象在JavaScript是著名的怪異和跨瀏覽器的不一致,特別是在模糊輸入。

我寫here 如何利用moment.js或本地Intl API,以確保您的日期將不會被轉換成用戶的時區(祕密是使用UTC操作方法)。

一般來說,最好始終指定任何時間和UTC偏移,或只是一個UTC時間戳,以確保您的輸入是明確的。

回來到您的例子,你可以用下面的代碼:

moment('2015-10-09T08:00:00-06:00') 
.utcOffset(+300).locale('en_gb').format("LLLL") 
// "Friday, 9 October 2015 19:00" cross-browser 

中,你說:「這是迄今爲止在UTC-0600,請把它轉換和打印爲UTC + 0500(300分鐘) 」。然後,您可以傳遞您希望打印的語言環境(即語言+文化特定設置,例如en_gb使用24小時制,而en_us使用12小時制)並使用moment.js支持的多種日期格式。

+2

照顧。實際上,Chrome仍然遵循ES5規範,就像IE9一樣。 ES6澄清未指定的偏移量意味着*本地*,以符合ISO-8601。然而,[這是積極的爭議](https://github.com/tc39/ecma262/issues/87)! [目前的妥協](https://github.com/tc39/ecma262/pull/138)是隻有日期仍然是UTC,而日期+時間使用本地(這仍然是瘋了恕我直言),但鉻有尚未採用它。 :( –

+0

@MattJohnson你是對的,我用另一種方式寫東西:)修正。 –

+1

謝謝。回答良好,另請參閱Chromium問題[543320](https://code.google.com/p/chromium/issues/detail?id=543320)和[539813](https://code.google.com/p/chromium/issues/detail?id = 539813)以及[我的博文](http://codeofmatt.com/2015/06/17/javascript-date-parsing-changes-in-es6/)。 :) –