2016-09-29 208 views
1

我一直在這個問題上撞了一天,進入源代碼,並且這個看起來是與真棒JavaScript的一個問題moment.tz庫:moment.tz設置「Etc/GMT [+ | - ] HH:MM」時區問題

每當我通過在「ETC/GMT 時間價值」時區標識符,返回moment.tz對象回來了什麼,我認爲是一個格式(「Z」)值乘以-1。

實施例:

var pacificTime = moment.tz("2016-09-29 21:00:00","America/Los_Angeles"); 
pacificTime.format("YYYY-MM-DD HH:mm:ss Z z"); 

輸出: 「2016年9月29日21點00分00秒-07:00 PDT」

所有如本文中所預期的。

現在,使用相同的時區(GMT-7):

var GMT_minus_7 = moment.tz("2016-09-29 21:00:00","Etc/GMT-7"); 
GMT_minus_7.format("YYYY-MM-DD HH:mm:ss Z z"); 

輸出: 「2016年9月29日21點00分○○秒07:00 GMT-7」

粗體值總是我認爲應該是的負值:傳入「Etc/GMT + 5」會返回「-5:00」值。

這是造成我頭疼,因爲網頁我的工作有日期/時間記錄記錄整數「GMT偏移」值,我只是變成「ETC/GMT」 + offset_value和通進入moment.tz做一個時區轉換。然後我需要對這個值進行進一步的操作(添加日期,顯示「Z」格式的值等),但是這個問題阻礙了進一步的工作。

這是一個用moment.tz解析「Etc/GMT」時區值的缺陷,還是我缺少關於時區格式化的基本知識?

+0

我做了一個進一步的測試,它似乎是一個格式化錯誤。TZ;我跑了以下測試: 'GMT_minus_7.utc()格式( 「YYYY-MM-DD HH:MM:SS Z Z」)' ,並獲得響應 「2016年9月29日14:00 :00 +00:00 UTC「 UTC轉換正確地從21:00減去7小時,直到14:00。所以看起來這個用例的「Z」值的格式可能不正確。 –

+0

WRT你的評論 - 你叫'.utc()',所以之後的任何事情都會用UTC,即'+00:00'。 –

回答

1

IANA數據庫中的標識符,例如Etc/GMT-7,其故意偏移的偏移量爲。這是這種標識符風格設計的一部分。見the note in Wikipedia on thisin the tz database source itself。 (基本上,它起源於在某些環境中需要向後兼容較舊的POSIX標準)。

但是,在Moment.js的情況下,如果您正在使用固定時區偏移。事實上,你根本不需要時區延時。

// the parseZone method will retain the offset provided 
var a = moment.parseZone("2016-09-29 21:00:00 -07:00"); 

// or, you can set the offset explicitly like this: 
var b = moment.utc("2016-09-29 21:00:00").utcOffset("-07:00", true); 

// or like this if you prefer: 
var c = moment.utc("2016-09-29 21:00:00").utcOffset(-7, true); 

對於bc,請注意true參數要保留給定本地時間。另請注意,我使用moment.utc(...)來初始化字符串。它也適用於moment(...),但是它的可能是本地時區中的DST轉換可能會干擾臨時值。

此外,請確認您認識到America/Los_Angeles在-8和-7之間交替出現,具體取決於DST是否生效。這就是爲什麼你需要時間 - 時區來提供何時在偏移之間切換的規則。

+0

太棒了!非常感謝你! –