Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 时区更改后,如何保持时区和日历最新?_Java_Timezone - Fatal编程技术网

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

Java 时区更改后,如何保持时区和日历最新?,java,timezone,Java,Timezone,时区的变化时有发生,我知道每年在英国似乎都有人在谈论我们应该取消格林尼治标准时间或使用“双倍夏令时” 当这些更改发生时,我猜想通过基于旧版本Java的时区或日历类获得的任何日期都可能会给您错误的数据。除了一直更新您的Java版本之外,还有什么方法可以解决这个问题吗?例如,您可以将始终最新的补丁文件放入应用程序中 此外,小程序的问题是否可以用同样的方式解决?因为您不能直接控制运行应用程序的Java版本/更新?Java日期读取系统的时间。这段时间通常与时间服务器同步,因此通常不会出现问题 时区API

时区的变化时有发生,我知道每年在英国似乎都有人在谈论我们应该取消格林尼治标准时间或使用“双倍夏令时”

当这些更改发生时,我猜想通过基于旧版本Java的
时区
日历
类获得的任何日期都可能会给您错误的数据。除了一直更新您的Java版本之外,还有什么方法可以解决这个问题吗?例如,您可以将始终最新的补丁文件放入应用程序中


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

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

时区API为您计算夏令时


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

时区API为您计算夏令时


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


如果由于任何原因无法实现,SUN会提供一个工具,用于将时区表更新为最新的时区表。您可以找到
TZUpdater

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


如果由于任何原因无法实现,SUN会提供一个工具,用于将时区表更新为最新的时区表。您可以找到
TZUpdater

如果时区中的某些内容发生了更改(如我的夏令时),它甚至会返回错误的时间。因此,最终用户应该更新他们的JRE

PS:另外,您可以在此处使用适用于IBM JRE的时区更新实用程序
马克·罗德斯是对的,如果某个时区发生了变化(比如我的夏令时),它甚至会返回错误的时间。因此,最终用户应该更新他们的JRE

PS:另外,您可以在此处使用适用于IBM JRE的时区更新实用程序
Java时区和派生的SimpleTimeZone类的文档说明

该类保存相对于GMT的偏移量(称为原始偏移量)以及夏令时的开始和结束规则 日程由于它只为每个对象保存单个值,因此无法处理偏移量中的历史更改 GMT和夏令时计划,但setStartYear方法可以指定 夏时制时间表开始生效

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

然而

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

如果维护历史上准确的日期/时间对您很重要(例如,向政府机构提交的账单记录具有非常明确的账单资格参数),那么您不仅需要在数据库中存储历史日期/时间信息,但是可以用来重新创建当时生效的时区规则的信息。有几种可能的解决办法

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

SimpleTimeZone(int-rawOffset、字符串ID、int-startMonth、int-startDay、int-startDayOfWeek、int-startTime、, int-endMonth、int-endDay、int-endDayOfWeek、int-endTime、int-DST)

构造一个SimpleTimeZone,该SimpleTimeZone具有给定的相对于GMT的基本时区偏移量、时区ID以及 开始和结束日光时间

因此,只需确保将数据库中的所有日期/时间信息存储为UTC时间戳即可。我喜欢将时间戳存储在数据库中,作为“修改过的朱利安日数”,它能够将日历日期和时间以毫秒精度存储在双精度中。修改后的朱利安天数始终在UTC中定义。不管怎样,只要你的信息是UTC的,你就是标准的


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

Java时区和派生SimpleTimeZone类的文档说明

该类保存相对于GMT的偏移量(称为原始偏移量)以及夏令时的开始和结束规则 日程由于它只为每个对象保存单个值,因此无法处理偏移量中的历史更改 GMT和夏令时计划,但setStartYear方法可以指定 夏时制时间表开始生效

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

然而

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