我的web應用程序客戶端從rest api服務器接收JSON數據。使用moment.js提取時區號碼
數據包含時區字符串值,如「Etc/GMT-1」。 對於計算時間,我需要提取時區號(就像-1)。 如果我使用parseInt(timezone);
,返回值是NaN
。
我不確定moment.js是否可以處理這種格式並提取GMT數字。 我認爲時區數據格式可能很靈活。 所以,我更喜歡使用moment.js。
有什麼辦法可以使用moment.js來提取數字嗎?
我的web應用程序客戶端從rest api服務器接收JSON數據。使用moment.js提取時區號碼
數據包含時區字符串值,如「Etc/GMT-1」。 對於計算時間,我需要提取時區號(就像-1)。 如果我使用parseInt(timezone);
,返回值是NaN
。
我不確定moment.js是否可以處理這種格式並提取GMT數字。 我認爲時區數據格式可能很靈活。 所以,我更喜歡使用moment.js。
有什麼辦法可以使用moment.js來提取數字嗎?
如果您還安裝moment-timezone,就可以得到該區域的偏移:
var offsetHours = moment.tz.zone("Etc/GMT-1").offsets[0]/60
offsetHours
變量的值將是-1
。請注意,我必須除以60,因爲API以分鐘爲單位返回值。
馬特在評論中提醒,通常時區有一個以上的有效抵消,根據日期 - 由於夏令時更改,甚至政治家決定改變自己國家的抵消 - 因此它是更好地得到基於特定的瞬間偏移量,如在解釋documentation:
moment.tz.zone('Etc/GMT-1').offset(1403465838805);
參數1403465838805
是因爲1970-01-01T00:00Z
的毫秒數。
專門針對Etc/GMT
時區,沒有區別,因爲它們沒有偏移量變化,但對於其他區域,最好使用即時。
Etc/GMT-1是標準格式。蘋果有它的文件:Documentation
只是供參考,因爲this Stackoverflow answear指出等/格林威治標準時間1應轉化爲GMT + 1。 如果你的輸入會一直等/ GMT#你可以寫你擁有一個在線的功能,例如提取它:
function extract(input_string){
return input_string.substring(input_string.indexOf("Etc/GMT")+7);
}
蘋果有一個*副本*它。更好的副本鏈接到[GitHub由Paul Eggert持有的](https://github.com/eggert/tz)(當前的tzdb維護者)。官方的tzdb版本是[here](https:// www.iana.org/time-zones)。另外,由於我在答案中指出的原因,我強烈建議不要從字符串中提取值。 –
字符串"Etc/GMT-1"
是一個有效的IANA時區標識符。你可以找到它in the tzdb sources,並在the list on Wikipedia。正如in the tzdb commentary指出的那樣,該符號與您所期望的相反。這意味着UTC + 1,而不是UTC-1。
你也說過:「我認爲時區數據格式可能是靈活的。」事實上,如果您的數據包含任何tzdb區域標識符,您應該假設所有時區標識符也是有效的,包括更傳統的形式,如"America/Los_Angeles"
或"Asia/Shanghai"
。因此,你不應該試圖從字符串本身提取任何東西。
重要的是要記住,雖然某些區域有一個固定的偏移,最代表的一系列偏移和它們之間的過渡點是很重要的。因此,您不應該嘗試從時區id獲取單個偏移量,也不要考慮時間點。這也在the timezone tag wiki的主題「時區!=偏移」下進行了介紹。
要將這些與moment.js一起使用,您還需要moment-timezone附加組件。例如:
var timeZone = 'Etc/GMT-1'; // your time zone
var m = moment.tz(timeZone); // get the *current* time in the time zone.
// or
var m = moment.tz(input, timeZone); // get a *specific* time in the time zone.
// or
var m = someOtherMomentObject.clone().tz(timeZone); // convert to the time zone.
var n = m.utcOffset(); // 60 (minutes West of GMT at the given point in time)
var s = m.format('Z'); // "+01:00" (offset as a string in ISO-8601 format)
有同樣的問題,所以用[label,value]爲自動完成創建了一個數組。請享用。
// npm install -S moment-timezone
import moment from 'moment-timezone'
import timezones from '<path-to-node_modules>/node_modules/moment-timezone/data/unpacked/latest.json'
// Build Timezone Array for autocomplete
const TIMEZONES = timezones.zones.map(i => {
let abbrs = i.abbrs.filter((el, index) => i.abbrs.indexOf(el) === index)
return { label : `${i.name.replace('_',' ')} (${abbrs})`, value: i.name}
})
慎用這種方法。對於'Etc/GMT *'區域,您可以很好地選取第一個偏移量。但對於其他區域,第一個條目很可能是LMT值。最好在特定時間點詢問偏移量,而不是評估偏移量數組。 –
@MattJohnson確實!我已將此信息添加到答案中,非常感謝! – 2017-07-15 18:43:32