Java夏令时问题

 

操作系统不使用 UTC 时间的情况下,操作系统会使用系统记录的夏令时跳变时间点自动进行夏令时切换。

suse11 系统在 cd /usr/share/zoneinfo 中有所有时区信息。可以用 zdump -v 时区 ID 查看时区信息,里面会有详细的夏令时切入切出点记录。

:

Europe/Budapest  Sun Mar 25 00:59:59 2012 UTC = Sun Mar 25 01:59:59 2012 CET isdst=0
Europe/Budapest  Sun Mar 25 01:00:00 2012 UTC = Sun Mar 25 03:00:00 2012 CEST isdst=1
Europe/Budapest  Sun Oct 28 00:59:59 2012 UTC = Sun Oct 28 02:59:59 2012 CEST isdst=1
Europe/Budapest  Sun Oct 28 01:00:00 2012 UTC = Sun Oct 28 02:00:00 2012 CET isdst=0
 

Java 也有自己的时区配置信息 , 记录在 %jre_home%/lib/zi , 其中包含夏令时配置。

 

 

Java 通过 TimeZone.getDefault() 发现或 System.getProperty("user.timezone") 获取当前时区。

如果 java 能获取到操作系统时区配置,并且 jre 中此时区的夏令时配置也和操作系统配置一致,则 java 程序能正确解析夏令时,如果 java 的夏令时规则和操作系统的不一样,则会辨识错误。

 

比如操作系统设置为 2012-10-6 GMT+3 时区 Asia/Baghdad

此时在xp操作系统上,这个时间点是可以勾选夏令时的,但是我们使用的 jre 中认为巴格达时区没有夏令时,

这时候解析的时间就会出错,系统显示的时间是标准时间,会比操作系统时间前一个小时 ( 夏令时比正常时间快 1 小时 )

( 通过世界时钟查询,今年巴干达确实没有夏令时 http://24timezones.com/zh_shi/baghdad_shi_zhong.php )

 

 

GMT +1 时区 Europe/Budapest ,操作系统记录的切入时间与切出时间与 jre 记录一样,这样夏令时切换不会有问题。

 

 

如果 Jre 时区与实际时区不一致需要下载 jre 更新工具

http://www.oracle.com/technetwork/java/javase/downloads/tzupdater-download-513681.html

或者使用 java 自动更新。

 

 

你可能感兴趣的:(java)