一、TimeZone 简介

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

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

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

1.获取默认的TimeZone对象

使用方法:

TimeZone tz = TimeZone.getDefault()

2.使用 getTimeZone(String id) 方法获取TimeZone对象

使用方法:

// 获取 “GMT+08:00”对应的时区

TimeZone china = TimeZone.getTimeZone("GMT+:08:00");

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

TimeZone chongqing = TimeZone.getTimeZone("Asia/Chongqing");

关于 getTimeZone(String id) 这种方式支持的全部id参数的取值,可以通过以下方式查找:

String[] ids = TimeZone.getAvailableIDs();

for (String id:ids)

System.out.printf(id+", ");

输出结果:

Etc/GMT+12, Etc/GMT+11, Pacific/Midway, Pacific/Niue ....等等

例如,创建上面第2个打印值“Etc/GMT+11”对应的TimeZone。方法如下:

TimeZone tz = TimeZone.getTimeZone("Etc/GMT+11");

TimeZone的函数接口

// 构造函数

TimeZone():

Object clone()

synchronizedstaticString[] getAvailableIDs()

synchronizedstaticString[] getAvailableIDs(intoffsetMillis)

intgetDSTSavings()

synchronizedstaticTimeZone getDefault()

finalString getDisplayName(Locale locale)

String getDisplayName(booleandaylightTime, intstyle, Locale locale)

finalString getDisplayName()

finalString getDisplayName(booleandaylightTime, intstyle)

String getID()

abstractintgetOffset(intera, intyear, intmonth, intday, intdayOfWeek, inttimeOfDayMillis)

intgetOffset(longtime)

abstractintgetRawOffset()

synchronizedstaticTimeZone getTimeZone(String id)

booleanhasSameRules(TimeZone timeZone)

abstractbooleaninDaylightTime(Date time)

synchronizedstaticvoidsetDefault(TimeZone timeZone)

voidsetID(String id)

abstractvoidsetRawOffset(intoffsetMillis)

abstractbooleanuseDaylightTime()

二、TimeZone示例:

下面通过示例演示在Date中使用TimeZone。

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

import java.text.DateFormat;

import java.util.Date;

import java.util.TimeZone;

/**

* TimeZone的测试程序

*/

public class TimeZoneTest {

public static void main(String[] args) {

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

showUsageOfTimeZones() ;

// 测试TimeZone的其它API

testOtherAPIs() ;

// 打印getTimeZone(String id)支持的所有id

//printAllTimeZones() ;

}

/**

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

*/

public static void showUsageOfTimeZones() {

TimeZone tz;

// (01) 默认时区

tz = TimeZone.getDefault();

printDateIn(tz) ;

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

tz = TimeZone.getTimeZone("GMT+08:00");

printDateIn(tz) ;

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

tz = TimeZone.getTimeZone("Asia/Chongqing");

printDateIn(tz) ;

}

/**

* 打印 tz对应的日期/时间

*/

private static void printDateIn(TimeZone tz) {

// date为2013-09-19 14:22:30

Date date = new Date(113, 8, 19, 14, 22, 30);

// 获取默认的DateFormat,用于格式化Date

DateFormat df = DateFormat.getInstance();

// 设置时区为tz

df.setTimeZone(tz);

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

String str = df.format(date);

System.out.println(tz.getID()+" :"+str);

}

/**

* 测试TimeZone的其它API

*/

public static void testOtherAPIs() {

// 默认时区

TimeZone tz = TimeZone.getDefault();

// 获取“id”

String id = tz.getID();

// 获取“显示名称”

String name = tz.getDisplayName();

// 获取“时间偏移”。相对于“本初子午线”的偏移,单位是ms。

int offset = tz.getRawOffset();

// 获取“时间偏移” 对应的小时

int gmt = offset/(3600*1000);

System.out.printf("id=%s, name=%s, offset=%s(ms), gmt=%s\n",

id, name, offset, gmt);

}

/**

* 打印getTimeZone(String id)支持的所有id

*/

public static void printAllTimeZones() {

String[] ids = TimeZone.getAvailableIDs();

for (String id:ids) {

//int offset = TimeZone.getTimeZone(avaIds[i]).getRawOffset();

//System.out.println(i+" "+avaIds[i]+" "+offset / (3600 * 1000) + "\t");

System.out.printf(id+", ");

}

System.out.println();

}

}

三、关于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是从 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中被列出。

推荐的解决方案 :

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

java -Duser.timezone=Asia/Shanghai DateTest

这个命令启动DateTest类,并设置 user.timezone属性到Asia/Shanghai。你也能够通过使用java.lang.System 类的setProperty方法来设置user.timezone 属性:

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

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

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

--------------------- 本文来自 earthchinagl 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/earthchinagl/article/details/71404061?utm_source=copy

java timezone_详解Java中的时区类TimeZone的用法相关推荐

  1. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  2. 【java】详解Java的类文件(class文件)结构

    1.概述 转载:详解Java的类文件(class文件)结构 大家好,我是二哥呀,今天我拿了一把小刀,准备解剖一下 Java 的 class 文件. CS 的世界里流行着这么一句话,"计算机科 ...

  3. java deepcopy_详解JAVA 深层拷贝 DeepCopy的使用方式

    说到复制方法,在开发程序中要怎么复制呢?其实复制Java数组的方法很多,但大多数都是浅层复制,今天爱站技术频道小编带你寻找详解JAVA 深层拷贝 DeepCopy的使用方式. 方法实现很简单,提供两种 ...

  4. java list详解_Java 中 list 用法案例详解

    LIST是个容器接口可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数,用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型 ...

  5. java构造器详解_Java中关于构造器的使用详解

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下 Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行 ...

  6. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  7. java toast_详解Android中的Toast源码

    Toast源码实现 Toast入口    我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生 ...

  8. java optional详解_java8中Optional的用法详解

    package com.lyzx.concurrent.java8; import org.junit.Test; import java.util.Optional; import java.uti ...

  9. java dateutils详解_java中DateUtils时间工具类详解

    package com.example.administrator.myapp; import java.text.ParseException; import java.text.SimpleDat ...

  10. java命令详解 java -D

    2019独角兽企业重金招聘Python工程师标准>>> JAVA 命令参数详解: 1.-D<name>=<value> set a system proper ...

最新文章

  1. 2022-2028年中国自热米饭市场竞争策略及行业投资潜力预测报告
  2. 公众号python训练营真的假的_python中的这些坑,早看早避免。
  3. windows系统下批量修改文件后缀
  4. Head first java chapter 16 集合与泛型(数据结构)
  5. linux为什么要交换内存,Linux系统中交换内存是什么?
  6. php统计字符个数,php中3种方法统计字符串中每种字符的个数并排序
  7. 经历了px、em之后,用 rem 适配屏幕
  8. iOS一个简单的设置圆角不引起性能问题的分类
  9. java中add和addall区别,java中list的add与addall方法区别
  10. while语句 ///do...while语句/// for语句/// foreach语句
  11. 锐捷客户端linux登录密码忘记,锐捷S3760忘记密码的恢复方法
  12. 最厉害的java混淆器_Java-哪个JAVA混淆器好用?
  13. python3 列表list 内置函数
  14. Macadam自然语言处理(NLP)工具包(TextClassification, SequenceLabeling, RelationExtraction)
  15. Python 语言中有关复数的几个概念
  16. Myabtis源码分析五-Mybatis配置加载完全图解,建造者模式的使用,涵盖Java各种技术栈
  17. Parcelable实战
  18. Quest3D的架构1...写在前面的胡思乱想
  19. React SSR路由支持实现
  20. vue3使用pako解压问题

热门文章

  1. Java版本微信授权登录(概览版)
  2. 使用 GitHub Pages 和 Hexo 以及 Aurora 主题搭建静态个人博客
  3. 电源控制环稳定性基础理论与调试方法
  4. luogu 2735 电网 皮克公式
  5. 2018年全国多校算法寒假训练营练习比赛(第三场)I 三角形【皮克公式+gcd】
  6. 哈佛幸福课23集观后感
  7. 天线接收功率计算公式_信号功率计算公式推导步骤
  8. HDMI接口 PCB布线指南-4层板为例
  9. 快速查询hive数据仓库表中的总条数
  10. 多台机器同步Windows上的文件 -cwRsync 同步问题