计算差异。不同地点/时区的时间(占夏令时)

时间:2011-03-30 06:42:32

标签: java .net timezone geocoding

我需要能够计算两个数据/时间值之间的差异,这两个数据/时间值代表(可能)两个不同地理位置的时刻。

我拥有的每个输入值都是以下元组:

  • 没有时区偏移的日期/时间值,例如6:54 AM, 12/3/2005
  • 描述特定时间位置的纬度/经度值(例如-33.8704, 151.1938)。

从两个输入值的任意组合,我需要计算时差(可能是分钟,天,年等)。首先,我需要:

  • 将每个输入值标准化到相关的GMT(或Zulu)时间。我想这可以通过将lat / long值转换为时区来完成。获得相关时区后,我需要根据指定日期计算夏令时差异,以确定准确时间。
  • 一旦时间值被标准化,计算差异就是微不足道的。

任何人都可以建议我如何:

  1. 将纬度/经度转换为时区
  2. 确定给定时区和日期的夏令时偏移量。
  3. 我想我需要(1)的某些功能和(2)的值数据库,但我不知道在哪里可以得到这些,或者如果他们是免费提供的。

    其他限制:

    • 我想要Java或.Net中的软件(因为我的软件应用程序可以使用其中编写的插件),
    • 我真的希望所有处理都是本地。我知道有一些网络服务来计算纬度/长度对的时区(如this Stackoverflow question中所讨论的那样,如Geonames.org或DRTEngine),但考虑到我拥有的数据量,我做了我不想依赖或点击我拥有的每个数据点的第三方网络服务,因此我更喜欢“免费”软件并在本地访问所有正确的信息。

    更新:感谢所有提供答案的人。我目前正在尝试通过使用GeoNames data并执行最近邻居计算来确定lat / long的时区来解决此问题,并将重点关注使用Joda Time和相关的最新tz database计算特定日期的夏令时抵消额。

2 个答案:

答案 0 :(得分:2)

一旦你有了一个时区,就不需要自己进行DST检查 - Java TimeZone,Joda Time DateTimeZone和.NET TimeZoneInfo类将需要照顾你。

(如果你使用的是Java,我强烈建议使用Joda Time而不是内置的日历类。)

我不知道有任何库将lat / long转换为时区,我担心。我确信必须有一些可用的东西,但我不知道它。请注意,任何此类库可能为您提供zoneinfo样式名称(例如“Europe / London”),其中不是 .NET TimeZoneInfo类不幸的是,使用。如果Noda Time已经准备就绪,我建议使用它而不是.NET,但我们还没有完成它:(

答案 1 :(得分:1)

只是一个愚蠢的问题......你确定你的时间戳不是GMT / Z / UTC。如果这些数据来自单一来源,甚至是多个类似的来源,这似乎更合乎逻辑。如果是这样,你的问题就会消失。

如果数据来自静态站点(即气象站)的集合,那么您可以使用其中一个建议的Web服务来查找时区,然后在本地缓存结果。不可否认,夏令时可能会导致问题,因为时区会根据日期而变化。