1.前言
在Java1.8中,推出了java.time包,弥补了Java在时间表达及格式化方面的不足。本文借助一些小例子,粗略地讨论了其中的主要方法。
2.主要方法
2.1 时钟Clock类
时钟类,可用于获取世界协调时(UTC) ,c.instant()得到的都是世界协调时,与所属时区无关。
例如:
```
Clock c1 = Clock.systemDefaultZone();// 本地时钟
System.out.println("标准时间毫秒值:" + c1.millis());// 标准时间微秒:1519568790440
System.out.println("标准日期时间:" + c1.instant());// c.instant()获取的都是世界协调时2018-02-25T12:47:44.173Z
Clock c2 = Clock.system(ZoneId.of("America/Los_Angeles")); // 洛杉矶时钟
System.out.println("标准日期时间:" + c2.instant());// c.instant()获取的都是世界协调时2018-02-25T12:47:44.173Z
2.2.时区ZoneId类
顾名思义,ZoneId的对象代表着各个时区。API对各个时区进行了预定义,并封装在一个静态Map集合SHORT_IDS 中。
EST - -05:00
HST - -10:00
MST - -07:00
ACT - Australia/Darwin
AET - Australia/Sydney
AGT - America/Argentina/Buenos_Aires
ART - Africa/Cairo
AST - America/Anchorage
BET - America/Sao_Paulo
BST - Asia/Dhaka
CAT - Africa/Harare
CNT - America/St_Johns
CST - America/Chicago
CTT - Asia/Shanghai
EAT - Africa/Addis_Ababa
ECT - Europe/Paris
IET - America/Indiana/Indianapolis
IST - Asia/Kolkata
JST - Asia/Tokyo
MIT - Pacific/Apia
NET - Asia/Yerevan
NST - Pacific/Auckland
PLT - Asia/Karachi
PNT - America/Phoenix
PRT - America/Puerto_Rico
PST - America/Los_Angeles
SST - Pacific/Guadalcanal
VST - Asia/Ho_Chi_Minh
部分代码如下:
Set<String> ids = ZoneId.getAvailableZoneIds();// 显示所有时区
ZoneId zoneId = ZoneId.systemDefault();// 系统默认时区
System.out.println(zoneId);// Asia/Shanghai
ZoneId id = ZoneId.of("America/Los_Angeles");// 洛杉矶时区
2.3时间Instant类
Instant代表世界协调时。相较于Date,Instant更加精确(纳秒),二者可以相互转换
Instant instant1 = Instant.now();// 获取当前时间
System.out.println(instant1);// 2018-02-26T14:20:44.536Z
Instant instant2 = Instant.now(c2);// 获取当前时间
System.out.println(instant2); // 2018-02-26T14:20:44.536Z
System.out.println("此时这秒钟已经过去了"+instant1.getNano()+"纳秒");//此时这秒钟已经过去了524000000纳秒
Date d = Date.from(instant1);// Instant转Date
Instant instant3 = d.toInstant();// Date转Instant
2.4本地日期LocalDate类
System.out.println("本地日期:" + LocalDate.now());// 本地日期:2018-02-25
System.out.println("洛杉矶日期:" + LocalDate.now(id));// 洛杉矶日期:2018-02-25
2.5本地时间LocalTime类
System.out.println("本地时间:" + LocalTime.now());// 本地时间:23:11:33.650
System.out.println("洛杉矶时间:" + LocalTime.now(c2));//洛杉矶时间:07:11:33.650
2.6本地日期时间LocalDateTime类
LocalDateTime localDateTime = LocalDateTime.of(2008, 8, 8, 8, 8, 8);// 自定义时间2008-08-08 08:08:08
System.out.println("本地日期:" + LocalDateTime.now());// 本地日期:2018-02-25T23:16:00.507
System.out.println("洛杉矶日期:" + LocalDateTime.now(id));// 洛杉矶日期:2018-02-25T07:16:00.507
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.getYear() + "年" + ldt.getMonthValue() + "月"+ldt.getDayOfMonth() + "日 " +
ldt.getHour() + ":" + ldt.getMinute()+ ":" + ldt.getSecond());// 2018年2月25日 23:21:11
2.7本地日期时间时区
6.时区日期时间ZonedDateTime
System.out.println("本地日期时区:" + ZonedDateTime.now());// 本地日期时区:2018-02-25T23:23:51.511+08:00[Asia/Shanghai]
System.out.println("洛杉矶日期时区:" + ZonedDateTime.now(id));// 洛杉矶日期时区:2018-02-25T07:24:27.294-08:00[America/Los_Angeles]
2.8持续时间Duration类
代表两端时间之间的间隔时间,可用于求时间差。
LocalDateTime l1 = LocalDateTime.of(2008, 8, 8, 8, 8, 8);// 2008-08-08 08:08:08
LocalDateTime l2 = LocalDateTime.of(2009, 9, 8, 9, 8, 8);// 2009-09-08 08:08:08
Duration duration = Duration.between(l1, l2);
System.out.println("天数差:" + duration.toDays());// 天数差:396
System.out.println("小时差:" + duration.toHours());// 小时差:9505
也可以用ChronoUnit求时间差
System.out.println("天数差:" + ChronoUnit.DAYS.between(l1, l2));// 天数差:396
System.out.println("小时差:" + ChronoUnit.HOURS.between(l1, l2));// 小时差:9505
2.9 时间格式化DateTimeFormatter类
相当于SimpleDateFormat类,内置了多种时间格式化对象,也可以自定义格式化对象,定义时的相关字段与SimpleDateFormat类不同,所有的字母都是样式字符,代表的含义也有所不同。
地区G 年u/y 月M/L 日d 上下午a 12时制h 24时制k 分m 秒s 微妙a 纳秒D
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("u-M-d k:m:s");// 自定义格式化方式
System.out.println(ldt);// 2018-02-26T21:36:17.304
System.out.println("格式化后的日期:" + ldt.format(dtf1));// 格式化后的日期:2018-02-26 21:36:17
// 格式化解析
LocalDateTime localDateTime = LocalDateTime.parse("2018-12-26 21:29:00", dtf1);// 获取时间
上文代码的u-M-d k:m:s不可画蛇添足写成u-MM-dd kk:mm:ss,否则若是日期文本为”2018-1-6 1:29:00“时,1只有一个字符,与MM对应不上,将会报错;反之,M和10月并不会报错。
3.总结
本文只是粗略地介绍了java.time的常用类及方法,更多内容请看API。水平有限,欢迎指正。
参考文档:http://blog.csdn.net/sun_promise/article/details/51383618