在时区更改后,如何使TimeZone和日历保持最新?

时间:2012-01-28 17:54:19

标签: java timezone

时区的变化确实时有发生,我知道英国每年都会有人说我们应该废弃GMT或使用“双夏时间”。

当发生这些变化时,我想通过旧版Java上基于TimeZoneCalendar的类获得的任何日期都可能会给您不正确的数据。除了仅仅更新Java版本之外,还有一种方法可以解决这个问题。像一个总是最新的补丁文件,你可以把它放到你的应用程序?

此外,Applets的问题是否也能以相同的方式解决 - 因为您没有直接控制运行该应用程序的Java版本/更新?

4 个答案:

答案 0 :(得分:1)

最佳解决方案是升级到最新的JRE和JDK。

如果由于某种原因无法做到这一点,SUN会提供一个工具,用于将时区表更新为最新的时区表。您可以找到TZUpdater here

答案 1 :(得分:1)

Java TimeZone和派生的SimpleTimeZone类的文档说明了......

  

该类与GMT保持偏移,称为原始偏移,以及夏令时的开始和结束规则   时间表。由于它只为每个值保存单个值,因此无法处理偏移量中的历史更改   GMT和夏令时计划,除了setStartYear方法可以指定年份时   夏令时时间表开始生效。

这意味着如果您的应用程序不依赖于历史日期/时间,那么如果您在生成这些对象时使用的TimeZone对象是最新的,那么您将不会遇到问题。 / p>

...然而

如果您的应用程序包含任何类型的历史日期/时间数据库,那么当新的时区规则生效时,您的应用程序将错误地解释您的历史信息并显示不正确的结果,因为它将使用的TimeZone对象不是与生成历史数据时使用的TimeZone对象相同。

如果您需要保持历史上准确的日期/时间(例如,向具有明确定义的结算资格参数的政府机构开具账单记录),那么您不仅需要存储数据库中的历史日期/时间信息,但也可用于重新创建当时有效的时区规则的信息。有一些可能的解决方案。

Java SimpleTimeZone类有一个构造函数,允许您使用一组时区和夏令时规则创建TimeZone对象:

  

SimpleTimeZone(int rawOffset,String ID,int startMonth,int startDay,int startDayOfWeek,int startTime,   int endMonth,int endDay,int endDayOfWeek,int endTime,int dstSavings)

     

构造一个SimpleTimeZone,其基本时区偏离GMT,时区ID和规则   开始和结束白天时间。

因此,请确保将所有日期/时间信息存储在数据库中作为UTC时间戳。我喜欢将数据库中的时间戳存储为"修改过的Julian Day Numbers"它能够将日历日期和时间存储为双精度的毫秒精度。修改后的Julian Days数字始终以UTC定义。无论如何,只要您的信息是UTC,您就是标准。

然后,您可以创建一个表,其中包含创建数据库中曾经使用过的SimpleTimeZone对象所需的所有参数,或者您可以使用您喜欢的对象持久性API简单地保存数据库使用的所有对象。使用指示用于相关数据的时区规则的外键,可以确保数据库应用程序可以在历史上准确报告当地时间。

答案 2 :(得分:0)

如果时区的某些东西发生了变化(就像我的夏季那样)马克罗德斯是正确的,它甚至会回到错误的时间。因此,最终用户应该更新他们的JRE。

PS:另外,您可以在此处使用适用于IBM JRE的TimeZone更新实用程序   http://www.ibm.com/developerworks/java/jdk/dst/jtzu.html

答案 3 :(得分:-2)

java日期读出系统的时间。这个时间通常与时间服务器同步,因此通常不会出现问题。

时区API为您节省了夏令时。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimeZone.html