如何使用纬度和经度坐标从某个位置获取时区?

Mat*_*int 281 timezone geolocation latitude-longitude

StackOverflow关于从某个位置解析时区的问题太多了.此社区wiki试图合并所有有效的响应.

请更新我的答案,或根据需要添加您自己的答案.

问题
鉴于某个位置的纬度和经度,如何知道该位置的有效时区?

在大多数情况下,我们正在寻找IANA/Olson时区ID,尽管某些服务可能只返回UTC偏移量或其他时区标识符.有关详细信息,请阅读时区标签信息.

Mat*_*int 382

时区位置Web服务

原始时区边界数据

以下项目以前是时区边界数据的来源,但不再积极维护.

时区地理位置离线实施

使用Timezone Boundary Builder数据的实现

使用旧的tz_world数据的实现

调用其中一个Web服务的库

  • timezone - 调用GeoNames的Ruby gem
  • AskGeo有自己的库,可以从Java或.Net调用
  • GeoNames几乎拥有所有客户端库

其他想法

如果您知道其他人,请更新此列表

另请注意,最近城市方法可能不会产生"正确"结果,只是近似值.

转换为Windows区域

列出的大多数方法都将返回IANA时区ID.如果需要转换为Windows时区以与TimeZoneInfo.NET中的类一起使用,请使用TimeZoneConverter库.

不要使用zone.tab

时区信息数据库包括一个名为文件zone.tab.此文件主要用于显示用户可从中挑选的时区列表.它包括每个时区的参考点的纬度和经度坐标.这允许创建突出显示这些点的地图.例如,请参阅moment-timezone主页上显示的交互式地图.

尽管使用此数据从纬度和经度坐标中解析时区可能很诱人,但请考虑这些是点 - 而不是边界.最好的方法是确定最近的点,在许多情况下这不是正确的点.

请考虑以下示例:

                            时区示例艺术

两个方块表示不同的时区,其中每个方块中的黑点是参考位置,例如zone.tab中可以找到的内容.蓝点代表我们试图找到时区的位置.显然,这个位置位于左侧的橙色区域内,但是如果我们只看到距参考点的最近距离,它将分解到右侧的绿色区域.

  • 这些新的Google API费率是敲诈勒索.截至7月18日的200美元请求.这是10倍的增长. (5认同)
  • GeoNames 实际上非常适合我的需要。谢谢! (2认同)

zbi*_*nsd 9

如何为node.js https://github.com/mattbornski/tzwhere提供此解决方案

它的Python对应物:https: //github.com/pegler/pytzwhere


小智 6

我们Teleport刚开始打开我们的API,其中一个用例也暴露了坐标的TZ信息.

例如,可以通过以下方式请求我们所有可用的坐标TZ信息:

curl -s https://api.teleport.org/api/locations/59.4372,24.7453/?embed=location:nearest-cities/location:nearest-city/city:timezone/tz:offsets-now | jq '._embedded."location:nearest-cities"[0]._embedded."location:nearest-city"._embedded."city:timezone"'
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容

{
  "_embedded": {
    "tz:offsets-now": {
      "_links": {
        "self": {
          "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z"
        }
      },
      "base_offset_min": 120,
      "dst_offset_min": 60,
      "end_time": "2015-10-25T01:00:00Z",
      "short_name": "EEST",
      "total_offset_min": 180,
      "transition_time": "2015-03-29T01:00:00Z"
    }
  },
  "_links": {
    "self": {
      "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/"
    },
    "tz:offsets": {
      "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/{?date}",
      "templated": true
    },
    "tz:offsets-now": {
      "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z"
    }
  },
  "iana_name": "Europe/Tallinn"
}
Run Code Online (Sandbox Code Playgroud)

对于示例,我使用./jq进行JSON解析.

  • 感谢分享。它是在执行最近城市方法,还是在使用多边形点方法?(请参见上面带有两个正方形的图表。) (2认同)