时区的变化确实时有发生,我知道英国每年都会有人说我们应该废弃GMT或使用“双夏时间”。
当发生这些变化时,我想通过旧版Java上基于TimeZone
或Calendar
的类获得的任何日期都可能会给您不正确的数据。除了仅仅更新Java版本之外,还有一种方法可以解决这个问题。像一个总是最新的补丁文件,你可以把它放到你的应用程序?
此外,Applets的问题是否也能以相同的方式解决 - 因为您没有直接控制运行该应用程序的Java版本/更新?
答案 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)
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