http://log-cd.javaeye.com/blog/368238
涉及有关时间区域信息时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.country
和java.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中被列出。