2017-07-14 77 views
1

我的web應用程序客戶端從rest api服務器接收JSON數據。使用moment.js提取時區號碼

數據包含時區字符串值,如「Etc/GMT-1」。 對於計算時間,我需要提取時區號(就像-1)。 如果我使用parseInt(timezone);,返回值是NaN

我不確定moment.js是否可以處理這種格式並提取GMT數字。 我認爲時區數據格式可能很靈活。 所以,我更喜歡使用moment.js。

有什麼辦法可以使用moment.js來提取數字嗎?

回答

0

如果您還安裝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時區,沒有區別,因爲它們沒有偏移量變化,但對於其他區域,最好使用即時。

+2

慎用這種方法。對於'Etc/GMT *'區域,您可以很好地選取第一個偏移量。但對於其他區域,第一個條目很可能是LMT值。最好在特定時間點詢問偏移量,而不是評估偏移量數組。 –

+0

@MattJohnson確實!我已將此信息添加到答案中,非常感謝! – 2017-07-15 18:43:32

0

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); 
} 
+0

蘋果有一個*副本*它。更好的副本鏈接到[GitHub由Paul Eggert持有的](https://github.com/eggert/tz)(當前的tzdb維護者)。官方的tzdb版本是[here](https:// www.iana.org/time-zones)。另外,由於我在答案中指出的原因,我強烈建議不要從字符串中提取值。 –

2

字符串"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) 
0

有同樣的問題,所以用[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} 
 
})

Autocomplete Data Array