2013-12-24 49 views
1

我使用moment.js將時區中的給定時間轉換爲當前時區中的相同時間。如何使用帶有Moment.js的AEST時區?

我的數據被指定爲以下格式:

{ 
    "start": "2013-12-10T09:00:00Z", 
    "end": "2013-12-10T11:00:00Z", 
    "timezone": "AEST" 
} 

我可以成功轉換的時刻以指定的格式以我目前的時區,例如:

var time = moment('2013-12-24T09:00:00Z').tz('Europe/London'); 
console.log(time.format('DD-MMM-YYYY')); 
console.log(time.format('h:mm:ss a')); 

但「AEST」是不在我從Moment.js timezone data builder檢索到的時區數據中 - 它改爲「Aus EST」。 AEST似乎是一個常用的縮寫(至少根據this Wikipedia page)。

Moment.js是否遵循特定的標準?是否有其他人遇到缺少(或不同名稱)時區的問題?

+0

AFAIK「AEST」通常在澳大利亞境內使用,指的是澳大利亞東部標準時間 - 我在那裏觀看了媒體展示,報紙和在線促銷活動。不知道Moment.js選擇「Aus EST」作爲名字背後的動機。 –

回答

4

來自時區數據生成器的數據是而不是使用「Aus EST」作爲時區縮寫。我相信你是困惑,因爲你看到的是這樣的:

moment.tz.add({ 
    "zones": { 
     "Australia/Brisbane": [ 
      "10:12:8 - LMT 1895 10:12:8", 
      "10 Aus EST 1971 10", 
      "10 AQ EST" 
     ] 
    }, 
    "rules": { 
     "Aus": [ 
      "1917 1917 0 1 7 0:1 0 1", 
      "1917 1917 2 25 7 2 0 0", 
      "1942 1942 0 1 7 2 0 1", 
      "1942 1942 2 29 7 2 0 0", 
      "1942 1942 8 27 7 2 0 1", 
      "1943 1944 2 0 8 2 0 0", 
      "1943 1943 9 3 7 2 0 1" 
     ], 
     "AQ": [ 
      "1971 1971 9 0 8 2 2 1", 
      "1972 1972 1 0 8 2 2 0", 
      "1989 1991 9 0 8 2 2 1", 
      "1990 1992 2 1 0 2 2 0" 
     ] 
    }, 
    "links": {} 
}); 

這裏的"Aus"是指內部規則標有「澳元」,並用縮寫僅僅是EST。您還可以看到該區域有第二條規則,標記爲"AQ"。這些規則名稱只是標籤,以便區域數據可以引用它們。您不應該注意規則名稱,只是區域名稱本身,例如此處顯示的"Australia/Brisbane"

該數據直接來自IANA/Olson time zone database。 Moment.js簡單地將其編譯爲更緊湊的JSON格式。你可以找到澳大利亞here的原始規則。

如果你願意,你可以閱讀同一個文件中的評論,該文件中有關是否使用AEST或EST作爲縮寫的詳細討論。但點可以歸結爲:

  • 在澳大利亞,很多隻是說只是「東部時間」,而不是「澳大利亞東部時間」
  • 在這裏,在美國,我們不會到處說「美國東部時間「,那爲什麼他們呢?
  • 即使我們這樣做,那麼會是AEST,所以這不會幫助。

這其實只是沒有標準的時區縮寫的一個例子。還有其他衝突,如至少有5種不同含義的「CST」,至少有3種其他衝突的「IST」等等。單個地區甚至有衝突,例如夏威夷,經常被標註爲「HST」,但在法律上是「HAST」(夏威夷 - 阿留申標準時間)。如果你想要更多的例子,你可以通過this list of abbreviations

因此,一般來說,除了用於顯示以外,不能依賴任何時區縮寫。您不應該在JSON數據中傳遞"AEST"。相反,通過"Australia/Brisbane",或任何實際的IANA /奧爾森時區標識符。您可以找到有效區域標識符here的完整列表。您還可以查看澳大利亞here的具體信息。

如果您的數據來自第三方,您應該要求他們相應地更改其API,因此它實際上可用。

「AEST」不是一個好標識符的另一個原因是像Australia/Brisbane這樣的區域常年使用它,而像Australia/Sydney這樣的區域在冬季使用AEST,在夏季使用AEDT。所以只要有AEST是不足以唯一識別時區的。

+0

明智的答案,感謝您花時間解釋! – goodforenergy