根据 JavaScript 和 Moment.js 的时间偏移推测时区

Guesstimate time zone from time offset with JavaScript and Moment.js

我知道这不会是万无一失的,因为偏移量不是特定于时区的,但是使用位置数据似乎可以做出有根据的猜测。

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

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

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

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

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

有什么想法吗?

这不是很优雅,但遍历时区数据库允许获取与给定偏移关联的所有时区。

请注意,时区数据库存储由于夏令时规则和时区历史演变而产生的偏移量变化。

给定一个以分钟为单位的偏移量,此函数 returns,根据 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]);
        }
      }
    }
  }

moment-timezone@0.5.0 添加了 moment.tz.guess() which attempts to guess the user's most likely timezone by looking at Date#getTimezoneOffset and Date#toString. It then picks the zone with the largest population. It's not perfect, but it's close enough! Data is pulled from this table 并在可用时使用 Intl

Fiddle

moment.tz.guess()

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