StackOverflow关于从某个位置解析时区的问题太多了 . 此社区wiki试图合并所有有效的响应 .
请更新我的答案,或根据需要添加您自己的答案 .
The Question
鉴于某个位置的纬度和经度,如何知道该位置有效的时区?
在大多数情况下,我们正在寻找IANA / Olson时区ID,尽管某些服务可能只返回UTC偏移量或其他时区标识符 . 有关详细信息,请阅读timezone tag info .
StackOverflow关于从某个位置解析时区的问题太多了 . 此社区wiki试图合并所有有效的响应 .
请更新我的答案,或根据需要添加您自己的答案 .
The Question
鉴于某个位置的纬度和经度,如何知道该位置有效的时区?
在大多数情况下,我们正在寻找IANA / Olson时区ID,尽管某些服务可能只返回UTC偏移量或其他时区标识符 . 有关详细信息,请阅读timezone tag info .
14 回答
Time Zone Location Web Services
Google Maps Time Zone API
Microsoft Azure Maps Time Zone API
GeoNames Time Zone API
TimeZoneDB API
AskGeo - 商业(但arguably more accurate than GeoNames)
GeoGarage Time Zone API - 商业,专注于航海时区 .
Raw Time Zone Boundary Data
以下项目以前是时区边界数据的来源,但不再积极维护 .
tz_world - 来自Eric Muller的原始shapefile数据
whereonearth-timezone - 合并了WOEDB数据的GeoJSON版本
Time Zone Geolocation Offline Implementations
使用Timezone Boundary Builder数据的实现
node-geo-tz - JavaScript库
tz-lookup - JavaScript库
GeoTimeZone - .NET库
timezonefinder - Python库
ZoneDetect - C库
Timeshape - Java库
lutz - R库
使用旧的tz_world数据的实现
latlong - 去图书馆(另请阅读this post . )
TimeZoneMapper - Java库
tzwhere - JavaScript /节点库
pytzwhere - Python库
timezone_finder - Ruby库
LatLongToTimeZone - Java和Swift库
What Time is it here? - 描述PHP和MongoDB的博客文章
rundel/timezone - R库
Libraries that call one of the web services
timezone - 调用GeoNames的Ruby gem
AskGeo有自己的库,可以从Java或.Net调用
GeoNames拥有几乎所有内容的客户端库
Other Ideas
找到最近的城市with an R-Tree
找到最近的城市with MySQL
如果您知道其他人,请更新此列表
另请注意,最近城市方法可能不会产生“正确”结果,只是近似值 .
Conversion To Windows Zones
列出的大多数方法都将返回IANA时区ID . 如果需要转换为Windows时区以与.NET中的
TimeZoneInfo
类一起使用,请使用TimeZoneConverter库 .Don't use zone.tab
tz database包含一个名为zone.tab的文件 . 此文件主要用于显示用户可从中挑选的时区列表 . 它包括每个时区的参考点的纬度和经度坐标 . 这允许创建突出显示这些点的 Map . 例如,请参阅the moment-timezone home page上显示的交互式 Map .
尽管使用此数据从纬度和经度坐标中解析时区可能很诱人,但请考虑这些是点 - 而不是边界 . 最好的方法是确定最近的点,在许多情况下这不是正确的点 .
请考虑以下示例:
两个方块表示不同的时区,其中每个方块中的黑点是参考位置,例如zone.tab中可以找到的内容 . 蓝点代表我们试图找到时区的位置 . 显然,这个位置位于左侧的橙色区域内,但是如果我们只看到距参考点的最近距离,它将分解到右侧的绿色区域 .
node.js的这个解决方案怎么样https://github.com/mattbornski/tzwhere
它的Python对应物:https://github.com/pegler/pytzwhere
我们在Teleport刚刚开始opening up our API's,其中一个用例也暴露了坐标的TZ信息 .
例如,可以通过以下方式请求我们所有可用的坐标TZ信息:
这将返回以下内容
对于示例,我使用./jq进行JSON解析 .
您可以使用geolocator.js轻松获取时区等等...
它使用需要密钥的Google API . 所以,首先配置geolocator:
Get TimeZone if you have the coordinates:
Example output:
Locate then get TimeZone and more
如果您没有坐标,则可以先找到用户位置 .
下面的示例将首先尝试使用HTML5 Geolocation API来获取坐标 . 如果它失败或拒绝,它将通过Geo-IP查找获得坐标 . 最后,它将获得时区和更多......
Example output:
以下是如何使用Google的脚本编辑器在gsheet中获取timezoneName和timeZoneId .
步骤1. Get an API key用于Google的时区API
第2步 . 创建一个新的gsheet . 在“工具”菜单下单击“脚本编辑器” . 添加以下代码:
步骤3.保存并发布
getTimezone()
功能并使用它,如上图所示 .好的是没有正确的NTP时间的短版本:
并使用它:
如果您想使用geonames.org,请使用此代码 . (但geonames.org有时很慢)
并使用它:
认识到这是一个比大多数人怀疑的更复杂的问题确实很重要 . 在实践中,我们中的许多人也愿意接受一组适用于“尽可能多的案例”的工作代码,其中至少可以识别并最小化其致命问题 . 所以我发布了所有这些以及OP的精神 . 最后,为了尝试将GPS转换为时区的其他人的实用 Value ,最终目标是拥有一个位置敏感的时间对象(更重要的是帮助提高平均实现的质量,使用此维基的时间对象),这里是我在Python中生成的内容(请随时编辑):
网上有几个源有时域的geojson数据(here's one,here's另一个)
使用几何库从geojson坐标创建多边形对象(shapely [python],GEOS [c],JTS [java],NTS [.net]) .
将lat / lng转换为点对象(但是库代表该对象)并检查它是否与时区多边形相交 .
通过使用纬度和经度获取当前位置的时区以下代码为我工作
尝试使用此代码从Java使用当前NTP时间客户端的Google时区API并更正UTC_Datetime_from_timestamp转换:
并使用它:
https://en.wikipedia.org/wiki/Great-circle_distance
这是一个使用JSON数据的好实现:https://github.com/agap/llttz
从孔雀鱼:
DstTzInfo
的绑定方法America/Anchorage.dst
America/Anchorage' LMT-1 day, 14:00:00 STD
如果您希望避免使用Web服务,可以从浏览器中检索该信息,如下所示:
在我目前的情况下,它是打印:
Full Date: 27/01/2014 16:53:37 UTC Offset: UTC-3 Country Code Timezone: BRT
希望它能有所帮助 .