关于java:计算之间的区别。 不同地点/时区的时间(占夏令时)

Compute difference btw. times at different locations/timezones (accounting for daylight savings)

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

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

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

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

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

任何人都可以建议我怎么做:

  • 将纬度/经度对转换为时区,并且
  • 确定给定时区和日期的夏令时偏移量。
  • 我想我需要(1)的一些函数和(2)的值数据库,但我不知道在哪里可以得到这些,或者它们是免费提供的。

    其他限制:

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

    更新:感谢所有提供答案的人。我目前正试图通过使用GeoNames数据并执行最近邻居计算来确定lat / long的时区来解决这个问题,并将专注于使用Joda Time和相关的最新tz数据库来计算特定的夏令时偏移量。日期。


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

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

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


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

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