初识Java.time

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值