主要内容
使用时区
通过java.util.TimeZone类,结合之前介绍的Calendar类,可以对时区进行特定的操作。
注意:在java 8中,时区使用新的类来表示:java.time.ZoneId,但这不是强制性的,只是在你使用了java 8新增的api时(例如ZoneDateTime)时,你才需要使用ZoneId类。如果不是,你仍然可以使用Calendar类和TimeZone类。
从Calendar获取TimeZone实例
1 2 3 4 5 |
Calendar calendar = new GregorianCalendar(); TimeZone timeZone = calendar.getTimeZone(); //输出Asia/Shanghai System.out.println(timeZone.getID()); |
创建TimeZone实例
除了利用Calendar获取TimeZone的实例外,TimeZone类本身提供了自己创建实例的方法。例如getDefault()
方法和getTimeZone()
方法。
1 2 3 4 5 6 7 |
//TimeZone timeZone = TimeZone.getDefault(); TimeZone timeZone = TimeZone.getTimeZone("Etc/GMT+8"); //创建Calendar并设置时区 Calendar calendar = new GregorianCalendar(); calendar.setTimeZone(timeZone); System.out.println(timeZone.getID()); |
getDefault
基于程序运行时所在的时区创建TimeZone。例如,对于在中国运行的程序,getDefault 基于中国标准时间创建 TimeZone对象,如果程序运行在美国,那么就基于美国时间创建TimeZone对象。
时区的名称,ID和偏移
- timeZone.getDispalyName()
- timeZone.getID()
- timeZone.getOffset(System.currentTimeMillis())
获取时区的显示名称
1 2 3 4 5 6 7 8 9 |
//中国标准时间 TimeZone timeZone = TimeZone.getDefault(); String displayName = timeZone.getDisplayName(); System.out.println(displayName); //太平洋标准时间 timeZone.setID("America/Whitehorse"); String displayName2 = timeZone.getDisplayName(); System.out.println(displayName2); |
获取时区的ID
时区的ID通常的表现形式为国家名称/地区名称
(但并非完全这样),可以使用TimeZone
的静态方法getAvailableIDs()
获取可用的时区ID。
1 2 3 4 |
String[] availableIDs = TimeZone.getAvailableIDs(); for(String timeZoneID : availableIDs){ System.out.println(timeZoneID); } |
获取时区的偏移量
getOffset()以milliseconds的方式返回在指定时区的指定时间
和UTC时区的差值。
1 2 3 4 5 |
TimeZone timeZone = TimeZone.getDefault(); int offset = timeZone.getOffset(System.currentTimeMillis()); //东八区和utc时间相差8个小时 int offsetHour = (int) (offset/1000/3600); System.out.println(offsetHour); |
时区之间的时间转换
利用Calendar类和TimeZone类,可以实现指定时区之间的时间转换。
1 2 3 4 5 6 7 8 9 10 11 12 |
//根据本地时区创建 Calendar calendar = new GregorianCalendar(); //输出 本地时间:16 System.out.println("本地时间:"+ calendar.get(Calendar.HOUR_OF_DAY)); //日本时区 TimeZone tokyo = TimeZone.getTimeZone("Asia/Tokyo"); //把日历设置为日本时区 calendar.setTimeZone(tokyo); //输出 日本时间:17 System.out.println("日本时间:" + calendar.get(Calendar.HOUR_OF_DAY)); |
下面是另一个例子,运行后输出的两个结果是一样的,都是Fri Mar 03 16:55:26 CST 2017
,这是一个坑,特别需要注意。
1 2 3 4 5 6 7 8 9 10 11 12 |
//日本时区 TimeZone tokyo = TimeZone.getTimeZone("Asia/Tokyo"); //根据本地时区创建 Calendar calendar = new GregorianCalendar(); Date localDate = new Date(calendar.getTimeInMillis()); System.out.println(localDate); //把日历设置为日本时区 calendar.setTimeZone(tokyo); Date tokyoDate = new Date(calendar.getTimeInMillis()); System.out.println(tokyoDate); |
注意:当时区更改之后,如果你使用calendar的getTimeInMillis()
方法获取时间戳。你会发现两个不同时区的时间戳是相同的。但是如果使用上面代码中的方法,它们的时间确实是不同的,这很容易造成混乱。
转载请注明:Pure nonsense » java每日一练之时间处理(三)使用时区