56

我有一个城市、州/省和国家/地区的列表,我需要轻松找到它们各自的时区。具体来说,我需要知道它们映射到哪个 Windows 时区。到目前为止,这是一个困难的过程,因为没有简单的方法可以将城市传递给某物并返回时区(时区是偏移量,并且时区是否支持夏令时)。

当前流程是使用http://www.batchgeocode.com获取城市的纬度/经度(这实际上称为 Yahoo 服务),然后调用http://www.EarthTools.org获取时区字母,映射到偏移量。问题是 yahoo 服务有时会返回错误的经度/纬度,而 earthtools.org 对 DST 信息了解不多,因此映射到正确的时区 ID 是一个繁琐的手动过程。

我不能成为第一个这样做的人 - 有没有人知道更好的方法,或者那里有一些包含我需要的信息的列表?

谢谢。

4

4 回答 4

44

有趣的问题!其他三个 SO 帖子(41504、55901 和237023提到了一些线索奥尔森数据库(参见维基百科条目的描述),但它看起来更算法/程序化(例如,如果你知道一个县名,印第安纳州的某些县有一个规则)。

我尝试查看 EarthTools 但它失败St.Pierre/Miquelon,这是一个很好的测试用例(-3:00 而不是附近的 Newfoundland 的 -3:30 这是 EarthTools 所说的)。

一些有希望的选择:worldtimeengine.com有一个免费的交互式版本和一个似乎很便宜的 API(每英镑 5000 个查询),但该 API 仅涵盖作为输入的经纬度查询(而不是作为输入的位置,这是交互式的东西)版本有)。

最佳线索:我会看一下geonames.org,它看起来有一个非常丰富的 API,你可以使用它们,它们既有免费(慢速)版本,也有商业版本以获得更好的性能。

ps 这里有一些很好的测试用例(来自worldtimezone.com维基百科的时区列表,时区地图也是说明性的):

  • 委内瑞拉加拉加斯 (-4:30)
  • 纽芬兰甘德 (-3:30)
  • 伊朗德黑兰 (+3:30)
  • 阿富汗喀布尔 (+4:30)
  • 尼泊尔加德满都 (+5:45)
  • 缅甸仰光 (+6:30)
  • 新西兰查塔姆群岛 (+12:45)
  • 复活节岛 (-6)
  • 圣皮埃尔和密克隆 (-3)
  • 福克兰群岛斯坦利 (-4)
  • 印第安纳州埃文斯维尔(-6=中部)
  • 安大略省,俄勒冈州(-7=山)
于 2009-01-17T16:31:58.097 回答
2

我们使用.NET C# MVC,我们需要每个国家/地区的Windows 时区列表。

这样对于每个注册用户,我们都可以自动设置时区。

大多数在线数据库都提供IANA时区,很难映射到特定国家/地区。

使用NodaTime,我们设法创建了一个列出以下条目的 Json。

CountryName
2LetterIsoCountryCode
3LetterIsoCountryCode
IANATimezones
WindowsTimezones

您可以在此处下载生成的 JSON

于 2016-10-20T17:06:20.083 回答
2

moment-timezone是一个用于时区计算的 JavaScript 库。

他们所有连接国家、时区和偏移量的时区数据都以 json 格式提供

于 2017-03-06T16:28:03.870 回答
0

我可以帮助您完成当前工作流程的第二部分。我编写了一个 Java 库,它将纬度/经度映射到时区,其中数据库在源代码中编码。

源代码基本上是一个巨大的 if 语句树:if (lat >= -33.0) if (lng < -151.5) ... else ... 等等。这只是一个班级。因此,如果您使用 C#,移植它是微不足道的。

http://www.edval.biz/mapping-lat-lng-s-to-timezones

精确到22公里。

于 2014-03-23T10:57:22.343 回答