使用JavaScript和Moment.js从时间偏移猜测时区

时间:2015-01-13 19:30:26

标签: javascript timezone momentjs

我知道这不是万无一失的,因为偏移不是特定于时区的,但是通过位置数据,似乎可以进行有根据的猜测。

基本上,我希望能够采用与此类似的对象:

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

...并返回单个或多个匹配的时区,即:

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

我能想到的一个解决方案是迭代moment-timezone提供的区域数据,但这似乎不是获取此信息的优雅方式。

有什么想法吗?

2 个答案:

答案 0 :(得分: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]);
        }
      }
    }
  }

答案 1 :(得分:1)

moment-timezone@0.5.0添加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)