从纬度经度估算与GMT的时间偏移量(大致时间)

13

有没有一种方法可以根据纬度/经度估算与GMT(或时区)的偏移量?我看过geonames,但这需要长期使用,我们不想依赖于网络服务。它仅用于确定在向各种用户提供信息时是显示“今天”还是“今晚”,因此不需要太准确(相差1-2小时也可以接受)。

3个回答

27
offset = direction * longitude * 24 / 360

其中direction为1表示东经,-1表示西经,而longitude的取值范围为(-180,180)


挺酷的,没想到会这么简单,但目前看起来相当准确。谢谢。 - ravun
1
@ravun,根据定义这是正确的,因为a)地球有360度经度,b)在24小时内绕着这360度旋转。(-: - Rob Wells
鉴于时区边界通常与国家边界相吻合,这个解释是“相对”正确的。否则,我每天上班时都得重新调整我的手表,回家时又得再次调整 :-) 此外,夏令时取决于当地的法律法规。但就今天/今晚的问题而言,这个解释应该足够了。 - balpha
3
这个极不准确。请查看http://askgeo.com/database/TimeZone上的地图,以及下面我的帖子获取更多细节。 - James D
1
@JamesD 当然这是极其不准确的。你有读上面评论线程吗?你有读问题吗?你不是真的在建议调用网络服务来决定说“今天”还是“今晚”,是吧? - balpha
显示剩余5条评论

1
基于经度来确定时区,在国际水域之外是极不准确的。请参考此页面上的地图:

http://askgeo.com/database/TimeZone

在深海中,垂直的彩色条纹是仅由经度推导出来的所谓自然时区,而陆地上的颜色则是根据法律规定的实际时区。你可以看到它们并不完全对齐。
我曾在另一个项目中遇到这个问题,并进行了大量的研究和开发。首先是我的研究:
首先,时区通常不仅仅是由与GMT(即UTC)的偏移量编码而成。这未能考虑夏令时和时区在多年间的变化。相反,时区ID用于指定一个地理区域,在该区域内官方时钟时间在一段时间内保持不变(例如,自1970年以来)。最重要的这类ID系统是“Olson时区ID”(这些ID及其偏移规则被称为“tz数据库”),它被Linux和其他Unix操作系统使用。大多数编程语言和操作系统都原生或第三方支持Olson时区ID。
就将纬度和经度转换为时区的现有解决方案而言:
  • GeoNames.org拥有一个庞大的点位置数据库(城市中心,机场,公共建筑等),每个点都附带一些有用的元数据,包括Olson时区ID。他们还有一个很好的API,让您通过网络访问这些内容。问题在于,除非您查询的点恰好位于其数据库中的记录正上方,否则您可能会得到跨越时区边界的结果,或者如果您的查询离它们最近的点很远,则可能根本没有响应。网络服务也非常缓慢,并且他们限制了您每天可以进行的查询次数。

  • Earth Tools(http://www.earthtools.org/webservices.htm)也提供了此服务,比GeoNames快得多,但它只返回与GMT的偏移量,而不是时区ID,并且对于世界上大多数地区,它无法正确处理夏令时。此外,它似乎已经不再维护,因此我不确定数据是否仍然准确(时区随时间而变化)。

在审查了这些选项并未找到其他可能性后,我决定构建自己的解决方案,并已在以下网址发布:

http://askgeo.com

AskGeo基于世界时区地图,因此它为每个有效的纬度和经度返回一个有效的时区。它返回标准的Olson时区ID(例如,“America/Los_Angeles”),在Linux和大多数其他操作系统和编程框架中使用。它还返回当前偏移量,充分考虑夏令时。
它非常易于使用,并且使用方法在网站的主页上有详细说明。API支持批量查询,因此如果您需要进行大量查找,请使用批量接口而不是通过串行请求拖慢我们的服务器。批量查询也更快,所以每个人都受益。
当我们首次推出这个产品时,我们在Google App Engine(GAE)上构建了它,并向所有用户提供免费服务。这是可能的,因为当时GAE的价格非常低。自那时以来,我们的服务器负载大大增加,而GAE的价格也大幅上涨。这两个因素的结合导致我们转向Amazon Web Services进行托管,并开始收取商业用途的费用,同时为非营利性、非商业开源项目和研究人员提供免费服务。对于商业用户,我们提供1000个免费查询,让潜在客户评估API是否符合他们的需求。有关定价和条款,请参见网站。

这个底层库是用Java编写的,由于广泛需求,我们还发布了商业许可下的库。完整的库文档和定价细节都在网站上。

我希望这对你有用。对我正在处理的项目来说,它肯定很有用。


他没有说他想要时区,而是想知道是白天还是黑夜。使用已接受答案中建议的平太阳时是准确确定这一点的最佳方法之一。 - marshal craft

0

如果您知道用户的经度,那么您完全了解他们的时间方面(忽略一些小错误,如特殊相对论等)。平太阳时只是GMT和经度之差(将度数部分转换为分钟,1度=60分钟)。根据东西方向添加或减去。平太阳时基本上比时区更准确。白天和黑夜的时间是可变的,取决于纬度,因此您可以使用一些近似的日出和日落时间,考虑到纬度、日期和年份。这本身就会提供相当准确的白天和黑夜概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接