我有一系列城市,州/省和国家/地区,我需要轻松找到各自的时区。具体来说,我需要知道他们映射到哪个Windows TimeZone。到目前为止,这是一个艰难的过程,因为没有简单的方法可以将城市传递给某个东西并获得时区(时区是一个偏移量,时区是否支持夏令时)。
当前流程是使用http://www.batchgeocode.com获取城市的纬度/经度(实际上称为Yahoo服务),然后调用http://www.EarthTools.org以获取时区字母,该字母映射到偏移量。问题是雅虎服务有时会返回糟糕的经度/纬度,而earthtools.org对DST信息知之甚少,因此映射到正确的TimeZone Id是一个繁琐的手动过程。
我不能成为第一个做到这一点的人 - 有没有人知道更好的方法,或者有哪些列表有我需要的信息?
感谢。
答案 0 :(得分:37)
有趣的问题!其他三个SO帖子(41504,55901和237023)提到了几个潜在客户。有Olson database(请参阅Wikipedia entry进行说明),但它看起来更算法/程序化(例如,如果您知道一个县名,那么Indiana中的某些县就有一个规则)
我试着看看EarthTools,但它failed代表St.Pierre/Miquelon,这是一个很好的测试案例(-3:00而不是附近纽芬兰的-3:30,这是EarthTools所说的)。 / p>
一些有前途的选择:worldtimeengine.com有一个免费的交互式版本和一个看起来很便宜的API(每英镑5000个查询),但API只包括lat,long查询作为输入(不是作为输入的位置,这是交互式版本的内容。
最佳潜在客户:我会看一下geonames.org,看起来它有一个很好的丰富的API,你可以使用它们,它们都有一个免费(慢)版本和一个商业版,以获得更好的性能。
P.S。这里有一些很好的测试用例(来自worldtimezone.com和Wikipedia's list of timezones,map of time zones也是说明性的):
答案 1 :(得分:2)
moment-timezone是用于时区计算的JavaScript库。
所有关联国家,时区和抵消的时区数据均为available in json format。
答案 2 :(得分:1)
我们使用 .NET C#MVC ,我们需要为每个国家/地区列出 Windows时区。
因此,对于每个注册用户,我们都可以自动设置时区。
大多数在线数据库提供 IANA 时区,并且很难映射到特定国家/地区。
使用NodaTime我们设法创建了一个列出以下条目的Json。
CountryName
2LetterIsoCountryCode
3LetterIsoCountryCode
IANATimezones
WindowsTimezones
您可以下载生成的JSON here。
答案 3 :(得分:0)
我可以帮助您完成当前工作流程的第二部分。我编写了一个将lat / long映射到时区的Java库,其中数据库是在源代码中编码的。
源代码基本上是一个巨大的if语句树:if(lat> = -33.0)if(lng< -151.5)... else ...依此类推。它只是一个班级。因此,如果您使用C#,移植它将是微不足道的。
http://www.edval.biz/mapping-lat-lng-s-to-timezones
准确到22公里。