String getID()
11.
abstract int getOfft(int era, int year, int month, int day, int dayOfWeek, inttimeOfDayMillis)
12.
int getOfft(long time)
13.
abstract int getRawOfft()
14.
synchronized static TimeZone getTimeZone(String id)
15.
boolean hasSameRules(TimeZone timeZone)
16.
abstract boolean inDaylightTime(Date time)
17.
synchronized static void tDefault(TimeZone timeZone)
18.
void tID(String id)
19.
abstract void tRawOfft(int offtMillis)
20.
abstract boolean uDaylightTime()
21.
22.
二、TimeZone示例:
下面通过示例演示在Date中使用TimeZone。
参考代码如下(TimeZoneTest.java):
1.
DateFormat;
2.
import java.util.Date;
3.
import java.util.TimeZone;
4.
5.
/**
6.
* TimeZone的测试程序
7.
*/
8.
public class TimeZoneTest {
9.
10.
public static void main(String[] args) {
11.
12.
// 测试创建TimeZone对象的3种方法
13.
showUsageOfTimeZones() ;
14.
15.
// 测试TimeZone的其它API
16.
testOtherAPIs() ;
18.
/
/ 打印getTimeZone(String id)支持的所有id 19.
//printAllTimeZones() ;
20.
}
21.
22.
23.
/**
24.
* 测试创建TimeZone对象的3种方法
25.
*/
26.
public static void showUsageOfTimeZones() { 27.
TimeZone tz;
28.
29.
// (01) 默认时区
30.
tz = Default();
31.
printDateIn(tz) ;
32.
33.
// (02) 设置时区为"GMT+08:00"
34.
tz = TimeZone("GMT+08:00"); 35.
printDateIn(tz) ;
36.
37.
// (03) 设置时区为""
38.
tz = TimeZone("Asia/Chongqing");
39.
printDateIn(tz) ;
40.
}
41.
42.
/**
43.
* 打印 tz对应的日期/时间
44.
*/
45.
private static void printDateIn(TimeZone tz) { 46.
// date为2013-09-19 14:22:30
47.
Date date = new Date(113, 8, 19, 14, 22, 30);
49.
DateFormat df = Instance();
50.
// 设置时区为tz
51.
df.tTimeZone(tz);
52.
// 获取格式化后的字符串
53.
String str = df.format(date);
54.
55.
System.out.ID()+" :"+str);
56.
}
57.
58.
/
**
59.
* 测试TimeZone的其它API
60.
*/
61.
public static void testOtherAPIs() {
62.
// 默认时区
63.
TimeZone tz = Default();
64.
65.
// 获取“id”
66.
String id = tz.getID();
67.
68.
// 获取“显示名称”
69.
String name = tz.getDisplayName();
70.
71.
// 获取“时间偏移”。相对于“本初子午线”的偏移,单位是ms。72.
int offt = tz.getRawOfft();
73.
// 获取“时间偏移” 对应的小时
74.
int gmt = offt/(3600*1000);
75.
76.
System.out.printf("id=%s, name=%s, offt=%s(ms), gmt=%s\n", 77.
id, name, offt, gmt);
78.
}
79.
/**
81.
* 打印getTimeZone(String id)支持的所有id
82.
*/
83.
public static void printAllTimeZones() {
84.
85.
String[] ids = AvailableIDs();
86.
for (String id:ids) {
87.
//int offt = TimeZone(avaIds[i]).getRawOfft();
88.
//System.out.println(i+" "+avaIds[i]+" "+offt / (3600 * 1000) + "\t");
89.
System.out.printf(id+", ");
90.
}
91.
System.out.println();
92.
}
93.
}
94.
三、关于TimeZone和时间校准
涉及有关时间区域信息时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是从 ur.timezone (system)属性那里得到。如果ur.timezone没有定义,它就会尝试从ur.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中被列出。推荐的解决方案 :
因此,你如何确保JAVA能给你正确的时间和日期呢?最好的办法是确认JAVA虚拟机(JVM)的默认TimeZone类是正确的,且是适合你的地理范围(Locale)的。你如何来确保默认TimeZone是正确的且适合的呢?这又是一个新问题了。象大多数处理的问题一样,这个也有许多解决方案。根据java.Default方法的源代码来看,最好的办法是正确地设置ur.timezone属性。在启动JAVA虚拟机时,你能很容易的通过使用 -D 命令 -line 参数的办法来覆盖(override)在java.lang.System.initProperties 方法中所设置的值。例如:
java -Dur.timezone=Asia/Shanghai DateTest
这个命令启动DateTest类,并设置 ur.timezone属性到Asia/Shanghai。你也能够通过使用java.lang.System 类的tProperty方法来设置ur.timezone 属性:
如果没有一个可用的时间区域ID适合你,那么就你可以创建一个自定义TimeZone 使用java.util.TimeZone 类的 tDefault 方法将