2016-03-14 53 views
1

有沒有辦法獲得DST轉換的時間。例如,有一些奇怪的時區出現了30分鐘的過渡。我得到這個的另一種方法是獲得標準和dst時間的utc偏移量,我可以減去這兩個偏移量。如何從MomentJS獲得DST金額

如果我做moment.tz(「美國/芝加哥」)._ z.offsets我可以訪問一個大陣的所有偏移。不過,我需要知道該數組中的哪個索引是當前年份。

有什麼想法?

+0

你能檢查這是否有幫助嗎? http://momentjs.com/timezone/docs/#/using-timezones/parsing-ambiguous-inputs/ – Raghavan

+1

您可以爲6月1日和12月1日創建一個日期,並比較時區偏移量。有很多地方根本沒有夏令時。 – RobG

+0

我稍後會發布更完整的答案,但羅布大部分都是正確的。創建兩個時刻並檢查它們之間的「utcOffset」差異。請記住,多年來轉換可能發生了變化,並非所有轉換都是由於DST引起的。此外,當前* DST轉換30分鐘的唯一區域是「Australia/Lord_Howe」。其餘的都是1小時或根本沒有。哦,然後是南極洲。 ;) –

回答

1

這將返回1月1日和今年的6月1日之間UTC偏移電流差 - 這可能是你在找什麼:

function getDSTBias(tz) { 
    var janOffset = moment.tz({month: 0, day: 1}, tz).utcOffset(); 
    var junOffset = moment.tz({month: 5, day: 1}, tz).utcOffset(); 
    return Math.abs(junOffset - janOffset); 
} 

這些都是比較安全的日期進行測試,如他們正處於冬季和夏季的中間 - 儘管這取決於北半球或南半球。在這兩個日期沒有DST轉換將發生anywhere in the world

您可能會看到其他代碼,建議7月1日,但DST weirdness in Morocco可以使7月1日標準時間日期。

如果你不喜歡硬編碼日期的想法,這裏是一個替代方法:

function getOffsetDelta(tz) { 
    var z = moment.tz.zone(tz); 
    var i = z._index(moment()); 
    return i < z.offsets.length-1 ? Math.abs(z.offsets[i] - z.offsets[i+1]) : 0; 
} 

這種方法使現在和任何下一個計劃是轉型之間的偏移量的差異。請注意,除了DST之外,還有其他的轉換原因 - 比如標準偏移量的變化。

另外請注意,這種替代方法不限制時間到當前年份。所以如果DST計劃在未來一年被取消,它將反映在結果中。你可以改變這種測試對最後過渡,但是這也將會給奇怪的結果如稱America/Phoenix具有60分鐘三角洲,因爲Arizona experimented briefly with DST in 1967

因此,在大多數情況下,第一種方法可能是最好的。

相關問題