有没有一种方法可以根据纬度/经度估算与GMT(或时区)的偏移量?我看过geonames,但这需要长期使用,我们不想依赖于网络服务。它仅用于确定在向各种用户提供信息时是显示“今天”还是“今晚”,因此不需要太准确(相差1-2小时也可以接受)。
有没有一种方法可以根据纬度/经度估算与GMT(或时区)的偏移量?我看过geonames,但这需要长期使用,我们不想依赖于网络服务。它仅用于确定在向各种用户提供信息时是显示“今天”还是“今晚”,因此不需要太准确(相差1-2小时也可以接受)。
offset = direction * longitude * 24 / 360
其中direction为1表示东经,-1表示西经,而longitude的取值范围为(-180,180)
http://askgeo.com/database/TimeZone
在深海中,垂直的彩色条纹是仅由经度推导出来的所谓自然时区,而陆地上的颜色则是根据法律规定的实际时区。你可以看到它们并不完全对齐。GeoNames.org拥有一个庞大的点位置数据库(城市中心,机场,公共建筑等),每个点都附带一些有用的元数据,包括Olson时区ID。他们还有一个很好的API,让您通过网络访问这些内容。问题在于,除非您查询的点恰好位于其数据库中的记录正上方,否则您可能会得到跨越时区边界的结果,或者如果您的查询离它们最近的点很远,则可能根本没有响应。网络服务也非常缓慢,并且他们限制了您每天可以进行的查询次数。
Earth Tools(http://www.earthtools.org/webservices.htm)也提供了此服务,比GeoNames快得多,但它只返回与GMT的偏移量,而不是时区ID,并且对于世界上大多数地区,它无法正确处理夏令时。此外,它似乎已经不再维护,因此我不确定数据是否仍然准确(时区随时间而变化)。
在审查了这些选项并未找到其他可能性后,我决定构建自己的解决方案,并已在以下网址发布:
AskGeo基于世界时区地图,因此它为每个有效的纬度和经度返回一个有效的时区。它返回标准的Olson时区ID(例如,“America/Los_Angeles”),在Linux和大多数其他操作系统和编程框架中使用。它还返回当前偏移量,充分考虑夏令时。这个底层库是用Java编写的,由于广泛需求,我们还发布了商业许可下的库。完整的库文档和定价细节都在网站上。
我希望这对你有用。对我正在处理的项目来说,它肯定很有用。
如果您知道用户的经度,那么您完全了解他们的时间方面(忽略一些小错误,如特殊相对论等)。平太阳时只是GMT和经度之差(将度数部分转换为分钟,1度=60分钟)。根据东西方向添加或减去。平太阳时基本上比时区更准确。白天和黑夜的时间是可变的,取决于纬度,因此您可以使用一些近似的日出和日落时间,考虑到纬度、日期和年份。这本身就会提供相当准确的白天和黑夜概念。