Bootstrap

详解Java中的时区类TimeZone的用法

时区可以用来获取或者规定时区,也可以用来计算时差,这里我们就来详解Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)中的时区类时区的用法,特别要注意下面所提到的时区相关的时间校准问题。

一、时区简介

时区表示时区偏移量,也可以计算夏令时。

在操作日期,日历等表示日期/时间的对象时,经常会用到时区;因为不同的时区,时间不同。

下面说说时区对象的2种常用创建方式。

1.获取默认的时区对象

使用方法:

TimeZone tz=TimeZone.getDefault()

2.使用getTimeZone(字符串id)方法获取时区对象

使用方法:

//获取" GMT 08:00 "对应的时区

时区中国=时区。gettime zone(“GMT:08:00”);

//获取"中国/重庆"对应的时区

时区重庆=TimeZone.getTimeZone('亚洲/重庆');

关于getTimeZone(字符串id)这种方式支持的全部身份证明(识别)参数的取值,可以通过以下方式查找:

string[]ids=时区。getavailableids();

对于(字符串id:ids)

System.out.printf(id ',');

输出结果:

太平洋/中途岛、太平洋/纽埃.等等

例如,创建上面第2个打印值" Etc/GMT 11 "对应的时区。方法如下:

时区tz=时区。gettime zone(' Etc/GMT 11 ');

时区的函数接口

//构造函数

时区():

对象克隆()

同步静态字符串[] getAvailableIDs()

同步静态字符串[]getAvailableIDs(整数偏移量毫秒)

int getDSTSavings()

同步静态时区getDefault()

最终字符串getDisplayName(区域设置)

字符串getDisplayName(布尔日光时间、室内风格、区域设置)

最终字符串getDisplayName()

最终字符串getDisplayName(布尔日光时间,室内风格)

字符串getID()

int getOffset(int era,int year,int month,int day,int dayOfWeek,int timeOfDayMillis)

int getOffset(长时间)

抽象int getRawOffset()

同步静态时区getTimeZone(字符串id)

布尔型hasSameRules(时区时区)

抽象布尔inDaylightTime(日期时间)

同步静态空设置默认值(时区时区)

空的集合id(字符串id)

抽象void setraw偏移量(整数偏移量毫秒)

抽象布尔useDaylightTime()

二、时区示例:

下面通过示例演示在日期中使用时区。

参考代码如下(TimeZoneTest.java):

导入Java。文字。日期格式;

导入Java。util。日期;

导入Java。util。时区;

/**

*时区的测试程序

*/

公共类时区测试{

公共静态void main(String[] args) {

//测试创建时区对象的3种方法

showUsageOfTimeZones();

//测试时区的其它应用程序接口

testOtherAPIs();

//打印getTimeZone(字符串id)支持的所有身份证明(识别)

//printAllTimeZones();

}

/**

* 测试创建时区对象的3种方法

*/

公共静态void showUsageOfTimeZones() {

时区tz;

//(01) 默认时区

tz=时区。get default();

打印日期(tz);

//(02) 设置时区为' GMT 08:00 '

tz=时区。gettime zone(“GMT 08:00”);

打印日期(tz);

//(03) 设置时区为''

tz=TimeZone.getTimeZone('亚洲/重庆');

打印日期(tz);

}

/**

* 打印坦桑尼亚对应的日期/时间

*/

私有静态作废打印日期(时区tz) {

//日期为2013-09-19 14:22:30

日期日期=新日期(113,8,19,14,22,30);

//获取默认的日期格式,用于格式化日期

日期格式。getinstance();

//设置时区为坦桑尼亚

df。settimezone(tz);

//获取格式化后的字符串

String str=df.format(日期);

系统。出去。println(tz。getid()':' str);

}

/**

* 测试时区的其它应用程序接口

*/

公共静态void testOtherAPIs() {

//默认时区

时区tz=时区。get default();

//获取" id "

字符串id=tz。getid();

//获取"显示名称"

字符串名称=tz。获取显示名称();

//获取"时间偏移"。相对于"本初子午线"的偏移,单位是女士。

int offset=tz。getraw offset();

//获取"时间偏移"对应的小时

int GMT=offset/(3600 * 1000);

System.out.printf('id=%s,名称=%s,偏移量=%s(毫秒),gmt=%s\n ',

id、名称、偏移量、GMT);

}

/**

*打印getTimeZone支持的所有id(字符串id)

*/

public static void printAllTimeZones(){

string[]ids=time zone .getavailableids();

for(字符串id:ids) {

//int offset=time zone . gettimezone(avaIds[I])。getraw offset();

//system . out . println(I ' 'avaIds[I]' ' offset/(3600 * 1000)' \ t ');

System.out.printf(id ',');

}

system . out . println();

}

}

三。关于时区和时间校准

谈到时区信息,Java和Solaris是相似的。每个时区都有一个时区ID标识符。在J2SE 1.3和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。此默认时区ID是从user.timezone (system)属性中获取的。如果没有定义user.timezone,它将尝试从user.country和java.home(系统)属性中获取ID。如果没有成功找到时区ID,它将使用GMT值“fallback”。换句话说,如果它不计算您的时区ID,它将使用GMT作为您的默认时区。

请注意,系统属性是在java.lang.System类的initProperties方法中初始化的。这是一个本地方法。因此,除非深入研究J2SE发行包中的本地代码库,否则无法获得源代码。但是,在Windows系统中,系统属性是从Windows注册表中初始化的,而在Linux/Unix中,它是由环境变量初始化的。properties方法的Javadoc声明某些属性“必须定义”并列出它们。在java.util.TimeZone类的getDefault方法使用的三个系统属性中,只有java.home被列为Javadoc中的“保证”属性。

推荐的解决方案:

那么,如何确保JAVA能给你正确的时间和日期呢?最好的方法是确保JAVA虚拟机(JVM)的默认时区类是正确的,并且适合您的语言环境。如何确保默认时区是正确且合适的?这又是一个新问题。像大多数问题一样,这个问题有很多解决方案。根据java.util.TimeZone.getDefault方法的源代码,最好的方法是正确设置user.timezone属性。启动JAVA虚拟机时,可以通过使用-D命令行参数轻松覆盖JAVA . lang . system . init properties方法中设置的值。例如:

Java-duser . time zone=亚洲/上海日期测试

该命令启动DateTest类,并将user.timezone属性设置为Asia/Shanghai。还可以使用java.lang.System类的setProperty方法设置user.timezone属性:

system . set property(' user . time zone','亚洲/上海');

如果没有可用的时区ID,那么您可以创建一个自定义时区,并使用java.util.TimeZone类的setDefault方法将其设置为默认时区——就像我前面在Initializer类中所做的那样。

记住,在J2SE中,大多数日期和时间相关的类都包含时区信息,包括那些格式类如java.text.DateFormat,所以它们都受JVM默认时区的影响。然而,当您创建这些类的实例时,您可以确保它们的正确时区信息,这使得您可以更容易地设置整个JVM的默认时区。一旦设置完毕,您就可以确保所有这些类都使用相同的默认时区。

原文地址:http://www.ccttoo.com/html/2348.html

本文来自网络,不代表菜鸟教程之家立场,转载请注明出处。

;