2015-01-13 50 views
3

我知道這不會是萬無一失的,因爲偏移量不是特定於時區的,但是使用位置數據,似乎可以讓一個受過教育的猜測。從JavaScript和Moment.js的時間偏移中猜測時區

基本上,我想能夠採取類似這樣的對象:

{ 
    offset: -5, 
    location: 'America' 
} 

...並取回單個或多個匹配時區,這將是:

['America/Montreal', 'America/New_York', ...] 

我能想到的一個解決方案是遍歷moment-timezone提供的區域數據,但這似乎並不是獲取此信息的優雅方式。

任何想法?

+2

一旁:有超過24個時區,例如+5:30和+5:45,請參閱http://en.wikipedia.org/wiki/List_of_UTC_time_offsets - 不確定您在使用'-5'做什麼,但您可能還想補償中間時區爲在前面提到。 – zamnuts

+1

假設你可以做你正在問的問題,你將如何處理多個時區的列表?你將如何縮小到一個從那裏使用?他們可能彼此非常不同。還應考慮在DST轉換附近的兩個相鄰時區之間可能會共享一個偏移量。例如,「2014-11-02T01:00-05:00」可以是*美國中央日光時間或美國東部標準時間([證明])(http://www.timeanddate.com/worldclock/converted.html ?異= 20141102T01&P1 = 64&P2 = 179))。 –

+0

就像我在第一句話中所說的,我非常清楚這一切。一個有效的方式來做出一個受過教育的猜測是我正在尋找的。 –

回答

1

[email protected]添加moment.tz.guess(),它試圖通過觀察Date#getTimezoneOffsetDate#toString猜測用戶的最有可能的時區。然後選擇人口最多的區域。這並不完美,但它足夠接近!數據從this table中提取,Intl在可用時使用。

Fiddle

moment.tz.guess() 

//= America/New_York (I'm in America/Montreal, but this works too) 
1

這不是很優雅,但通過時區數據庫迭代允許獲得與給定偏移相關的所有時區。

請注意,時區數據庫存儲由夏令時規則引起的偏移量變化以及時區的歷史演變。

給定一個以分鐘爲單位的偏移量,該函數根據iana timezone database返回在歷史中使用此偏移量一次的所有時區的列表,或者將在未來使用該偏移量一次。

function getZonesByOffset(offset){ 
    //offset in minutes 
    results = []; 
    var tzNames = moment.tz.names(); 
    for(var i in tzNames){ 
    var zone = moment.tz.zone(tzNames[i]); 
    for(var j in zone.offsets){ 
     if(zone.offsets[j] === offset){ 
     //Add the new timezone only if not already present 
     var inside = false; 
     for(var k in results){ 
      if(results[k] === tzNames[i]){ 
      inside = true; 
      } 
     } 
     if(!inside){ 
      results.push(tzNames[i]); 
     } 
     } 
    } 
    } 
+0

謝謝,這看起來應該工作,我會給它一個鏡頭。 –

相關問題