JAVA日期和时间类彻底解决(3)完

原创 2003年11月21日 15:51:00

What's your time zone?

JAVA日期和时间类彻底解决(3)

Page 3 of 3

时间区域和JAVA 
涉及有关时间区域信息时Java和Solaris很相似。每个时间区域都有一个时间区域ID标识符。在J2SE 1.3 and 1.4中,这个ID是个字符串,是由位于J2SE 安装程序的jre/lib子目录中的tzmappings文件这些ID列表。 J2SE 1.3 仅仅只包含tzmappings文件,但是 J2SE 1.4包含世界不同地区的时间区域数据文件。jre/lib/zi存放着这些文件。在J2SE 1.4里,sun.util.calendar.ZoneInfo从这些文件获取DST规则。在Solaris中, 这些时间区域数据文件是以二进制形式存放的,不是文本文件,因此你不能看它们。 在J2SE 1.4中的时间区域数据文件和在Solaris中是不同的。

java.util.TimeZone类getDefault方法的源代码显示,它最终是会调用sun.util.calendar.ZoneInfo类的getTimeZone 方法。这个方法为需要的时间区域返回一个作为ID的String参数。这个默认的时间区域ID是从 user.timezone (system)属性那里得到。如果user.timezone没有定义,它就会尝试从user.countryjava.home (System)属性来得到ID。 如果它没有成功找到一个时间区域ID,它就会使用一个"fallback" 的GMT值。换句话说, 如果它没有计算出你的时间区域ID,它将使用GMT作为你默认的时间区域。

注意,System属性是在java.lang.System类的initProperties方法中被初始化的。这是一个本地方法。因此源代码是不可用的----除非你深入到J2SE分发包中的本地代码库中去研究。然而,在Windows系统中,System 属性是从Windows注册表中被初始化的,而在Linux/Unix中是由环境变量来进行初始化。initProperties方法的Javadoc声明,某些属性"必须保证被定义" 且列出它们。被java.util.TimeZone类的getDefault方法使用的三个System属性中,只有java.home作为一种“保证的”属性在Javadoc中被列出。

推荐的解决方案
因此,你如何确保JAVA能给你正确的时间和日期呢?以我的观点,最好的办法是确认JAVA虚拟机(JVM)的默认TimeZone类是正确的,且是适合你的地理范围(Locale)的。你如何来确保默认TimeZone是正确的且适合的呢?这又是一个新问题了。象大多数处理的问题一样,这个也有许多解决方案。根据java.util.TimeZone.getDefault方法的源代码来看,最好的办法是正确地设置user.timezone属性。在启动JAVA虚拟机时,你能很容易的通过使用 -D 命令 -line 参数的办法来覆盖(override)在java.lang.System.initProperties方法中所设置的值。例如:

java -Duser.timezone=Asia/Jerusalem DateTest

这个命令启动DateTest类(在这个文章开头被列出的),并设置 user.timezone属性到Asia/Jerusalem。你也能够通过使用java.lang.System 类的setProperty方法来设置user.timezone 属性:

System.setProperty("user.timezone","Asia/Jerusalem");

如果没有一个可用的时间区域ID适合你,那么就你可以创建一个自定义TimeZone 使用java.util.TimeZone 类的 setDefault 方法将它设置为默认的时间区域----就象我先前在ItsInitializer 类中所做的操作一样。

记住,在J2SE中,大多数日期和时间相关的类都包含时间区域信息,包括那些格式类,如java.text.DateFormat, 因此它们都会被JVM的默认时间区域所影响。然而,在你创建这些类的实例时,你能为它们确保正确的时间区域信息,使得你可以更容易来设置整个JVM的默认时间区域。并且一旦设置好,就可以确保所有的这些类都将使用同一个默认的时间区域。但是,古语云,“事事难料”。

所以,努力接触并驯服这些JAVA日期/时间类吧!

Translated by Willpower,2003.11.20

JAVA日期和时间类彻底解决(3)

时间区域和JAVA 涉及有关时间区域信息时Java和Solaris很相似。每个时间区域都有一个时间区域ID标识符。在J2SE 1.3 and 1.4中,这个ID是个字符串,是由位于J2SE 安装程序的...
  • huxin1
  • huxin1
  • 2008年11月09日 01:35
  • 624

JAVA日期和时间类彻底解决(2)

 首先尝试的解决方案 基于Java文档信息和DateTest类的输出结果,我打了一个最好的赌:JAVA虚拟机在第一次被运行时就自动设置了一个默认的时间区域(time zone)。为了验证,我创建了一个...
  • huxin1
  • huxin1
  • 2008年11月09日 01:32
  • 470

JAVA日期和时间类彻底解决(1)

Whats your time zone? JAVA日期和时间类彻底解决(1) Page 1 of 3 你是否在苦苦挣扎在JAVA语言中的日期和时间中?当你在计算机上显示日期和时间时,, 是否要快一个...
  • caiyi0903
  • caiyi0903
  • 2003年11月18日 09:58
  • 1583

JAVA日期和时间类彻底解决(1)

你是否在苦苦挣扎在JAVA语言中的日期和时间中?当你在计算机上显示日期和时间时,, 是否要快一个小时?或者可能要早一个小时?, 或者两个小时, 或者更严重? 当你试图用JAVA写日期和时间到一个文件中...
  • huxin1
  • huxin1
  • 2008年11月09日 01:30
  • 411

JAVA日期和时间类彻底解决(2)

Whats your time zone? JAVA日期和时间类彻底解决(2) Page 2 of 3 首先尝试的解决方案 基于Java文档信息和DateTest类的输出结果,我打了一个最好的赌:JA...
  • caiyi0903
  • caiyi0903
  • 2003年11月19日 12:16
  • 1437

Java日期时间类

Java日期时间类 Date类 Java提供的Date类和Calendar类用于处理日期和时间的类,包括创建日期,时间对象,获取系统当前日期,时间 等操作。但Date类无法实现国际化,注意,月份...
  • hephec
  • hephec
  • 2014年11月28日 10:56
  • 889

Java日期和时间类简介

Java 的日期和时间类位于 java.util 包中。利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间。 Date 类 Date 类是 Java 中的日...
  • liyan530
  • liyan530
  • 2017年08月06日 13:48
  • 294

Java 8的日期、时间类

Java原本提供了Data和Calendar用于处理日期、时间的类,包括创建日期、时间对象,获取系统当前日期、时间等操作。但Date不仅无法实现国际化,而且它对不同属性也使用了前后矛盾的偏移量,比如月...
  • OREO_GO
  • OREO_GO
  • 2016年08月10日 01:29
  • 2759

黑马程序员_java日期时间类

1、Date类 Date类对象的创建: 创建一个当前时间 默认是创建一个代表系统当前日期的Date对象 Date d = new Date(); 创建一个我们指定的时间的Date对象: 下...
  • zhanggeng22
  • zhanggeng22
  • 2013年02月17日 14:36
  • 102

时间和日历类的设计(Java的Date和Calendar的C++实现)

时间和日历以及时间的格式化处理在软件的设计中起着非常重要的作用,但是目前C++的库却未有一个简单易用的时间类,大部分都需要开发者直接调用操作系统的API来完成,而且很多API都不是线程安全的。某些大型...
  • javenstudio
  • javenstudio
  • 2005年11月09日 17:46
  • 2298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA日期和时间类彻底解决(3)完
举报原因:
原因补充:

(最多只允许输入30个字)