2015-01-13 49 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

谢谢,这看起来应该工作,我会给它一个镜头。 –

相关问题