2012-01-28 75 views
2

时区的变化确实时有发生,我知道英国每年都有人说我们应该取消格林威治标准时间或使用“双重夏令时”。如何在时区更改后让TimeZone和日历保持最新状态?

发生这些更改时,我猜测通过基于老版本Java的TimeZoneCalendar基类获得的任何日期都可能会给您提供不正确的数据。无论何时只是更新Java版本,都可以解决这个问题。像一个始终最新的补丁文件,你可以把你的应用程序?

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

回答

1

最好的解决办法是升级到最新的JRE和JDK。

如果无论出于何种原因这是不可能的,SUN提供了一个工具来将时区表更新为最新的工具。你可以找到TZUpdaterhere

-2

java日期读出系统的时间。这段时间通常与时间服务器同步,所以通常不会有问题。

时区API会为您计算夏令时。

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

+0

但是,TimeZone课程将如何给出正确答案?如果时区有变化,而且它是旧版本的课程,它会不会只是错误的? – 2012-01-28 18:07:14

+0

哦,不确定,所以实际上我不想发布...可能是stackover。为我做了... – Pieter 2012-01-30 18:26:47

1

了Java TimeZone的派生的SimpleTimeZone类的文档,并指出...

类持有从偏移格林尼治标准时间,被称为原始偏移量,以及夏令时 时间表的开始和结束规则。由于它只为每个值保存单个值,因此它不能处理从格林尼治标准时间和夏季时间表的偏移量的历史变化,但setStartYear方法可指定夏令时开始生效的年份。

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

但是......

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

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

Java的的SimpleTimeZone类有一个构造函数,可以让你创建一个TimeZone对象与一组的时区和夏令时规则:

的SimpleTimeZone(INT rawOffset,字符串ID,INT startMonth,INT朝九特派,INT startDayOfWeek,INT开始时间, INT endMonth,INT endday指定,INT一个endDayOfWeek,INT结束时间,整数dstSavings)

构造具有给定基准时区与GMT的时差,时区ID,和规则 起动一个SimpleTimeZone并结束夏令时。

因此,只要确保将所有日期/时间信息作为UTC时间戳存储在数据库中。我喜欢将时间戳存储在数据库中作为“修改的Julian日期编号”,它能够将日历日期和时间以毫秒的精度存储在双精度上。修改的Julian天数总是用UTC来定义的。无论如何,只要你的信息是UTC,你就是标准的。

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

相关问题