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

2024-04-23 09:36:37 发布

您现在位置:Python中文网/ 问答频道 /正文

StackOverflow上有太多关于从一个位置解析时区的问题。此社区wiki试图整合所有有效的响应。

请更新我的答案,或添加您自己认为合适的。

问题
给定一个地点的经纬度,如何知道该地点的时区是有效的?

在大多数情况下,我们都在寻找一个IANA/Olson时区id,尽管有些服务可能只返回一个UTC偏移量或其他时区标识符。请阅读timezone tag info了解详细信息。


Tags: 答案idtagwiki情况标识符stackoverflow社区
3条回答

时区定位Web服务

原始时区边界数据

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

时区地理位置离线实施

使用时区边界生成器数据的实现

使用旧的tz_world数据的实现

调用其中一个web服务的库

  • timezone-调用GeoNames的Ruby gem
  • AskGeo有自己的库用于从Java或.Net调用
  • GeoNames几乎所有东西都有客户端库

其他想法

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

另外,请注意,最近的城市方法可能不会产生“正确”的结果,只是一个近似值。

转换到Windows区域

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

不要使用zone.tab

tz database包含一个名为^{}的文件。此文件主要用于显示供用户选择的时区列表。它包括每个时区参考点的经纬度坐标。这允许创建突出显示这些点的地图。例如,请参见the moment-timezone home page上显示的交互式映射。

虽然使用这些数据从经纬度坐标解析时区可能很有诱惑力,但请考虑这些是点,而不是边界。最好的办法是确定最近的点,在许多情况下,这不是正确的点。

请考虑以下示例:

Time Zone Example Art

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

我们在Teleport刚刚开始opening up our API's,其中一个用例还公开了坐标的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"'

这将返回以下内容

{
  "_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"
}

例如,我使用./jq进行JSON解析。

这个node.js的解决方案怎么样 https://github.com/mattbornski/tzwhere

与之对应的Python: https://github.com/pegler/pytzwhere

相关问题 更多 >