【Java8新特性】06 新的日期和时间:LocalDate LocalTime LocalDateTime
Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本了。 Java8吸收其他语言的精髓带来了函数式编程,lambda表达式,Stream流,新日期时间接口等一系列新特性,学会了这些新特性,可以让你实现高效编码、优雅编码。
(1) Date
java.util.Date类是Jdk 1.0引入的,易用性非常糟糕,比如年份的起始是1900年,月份的起始是0。比如要表示2019年6月18日,创建一个Date实例:
Date date = new Date(119, 5, 18);
Date类已经不推荐使用了。
(2) Calendar
为了解决Date糟糕的设计,Jdk 1.1 引入了java.util.Calendar类。不幸的是Calendar没有扛起大任,仍然暴露出很多设计缺陷,导致写代码时容易出现问题,比如月份还是从0开始。
由于Date和Calendar推出的时间很接近,造成程序员对使用哪个类感到困惑。
还有一个很大的问题,Date和Calendar都是可变的类,这种设计会导致程序出现各种问题。
Date和Calendar的种种问题导致程序员们纷纷抛弃原生的jdk日期时间库,转投第三方组件如Joda-Time,Java设计者似乎意识到这个问题,在借鉴Joda-Time的基础上终于在Java8版本中加入了新的日期时间包java.time.*
2. Java8 新的日期时间API
(1)日期时间常用类
针对日期和时间,Java8提供了LocalDate, LocalTime, LocalDateTime, Instant等常用类。Instant类是机器容易理解的类,通常以毫秒等整数值对时间进行建模。
创建实例常见操作:
// 当前日期
LocalDate date1 = LocalDate.now();
// 指定日期
LocalDate date2 = LocalDate.of(2019, 6, 18);
LocalDate date3 = LocalDate.of(2019, Month.JULY, 18);
// 当前时间
LocalTime time1 = LocalTime.now();
// 指定时间
LocalTime time2 = LocalTime.of(21, 10, 59);
// 当前日期时间
LocalDateTime dateTime1 = LocalDateTime.now();
// 指定日期时间
LocalDateTime dateTime2 = LocalDateTime.of(2019, 6, 18, 21, 10, 59);
// 当前时间戳
Instant instant1 = Instant.now();
// 指定时间戳
Instant instant2 = Instant.ofEpochMilli(1000000L);
(2)时间计算
可以用plus,minus对时间日期进行操作:
LocalDate today = LocalDate.of(2019, 6, 18);
LocalDate tomorrow = today.plus(1L, ChronoUnit.DAYS);
System.out.println(tomorrow); // output: 2019-06-19
LocalDate yesterday = today.minus(1L, ChronoUnit.DAYS);
System.out.println(yesterday); // output: 2019-06-17
你还可以通过Duration计算两个时间的间隔:
Duration duration = Duration.between(dateTime2, dateTime1);
System.out.println(duration.toHours()); // output: 841
Period通过用来计算两个日期之间的间隔:
Period period = Period.between(date2, date1);
System.out.println(period.toTotalMonths()); // output: 1
Duration和Period还包含了很多实用的方法如from,of等,大家可以自行看源码进行学习。
(3)时间解析和格式化
LocalDate,LocalTime,LocalDateTime都有parse静态方法用来解析给定的时间日期串:
// 时间日期解析
LocalDateTime parsedDateTime = LocalDateTime.parse("2019/06/18 12:11:10",
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
System.out.println(parsedDateTime); // output: 2019-06-18T12:11:10
时间格式化可以使用java8提供的新类DateTimeFormatter,java8之前的SimpleDateFormat不推荐大家再用了。
// 时间日期格式化
LocalDateTime dateTime = LocalDateTime.now();
// 使用自定义formatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dateTime.format(formatter)); // output: 2019-07-23 23:09:19
// 使用系统自带formatter
System.out.println(dateTime.format(DateTimeFormatter.ISO_DATE_TIME)); // output: 2019-07-23T23:09:19.31
(4)时区使用方法
java8之前使用java.util.TimeZone类处理时区,java8新增ZoneId替代TimeZone。
ZoneId实例化方法:
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZoneId zoneId2 = ZoneId.systemDefault();
老时区对象转化为新时区:
ZoneId zoneId3 = TimeZone.getDefault().toZoneId();
带时区的时间表示方法:
LocalDateTime dateTime2 = LocalDateTime.of(2019, 6, 18, 21, 10, 59);
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = dateTime2.atZone(zoneId);
// output: 2019-06-18T21:10:59+08:00[Asia/Shanghai]
System.out.println(zonedDateTime);
ZoneId zoneId2 = ZoneId.systemDefault();
ZonedDateTime zonedDateTime2 = dateTime2.atZone(zoneId2);
// output: 2019-06-18T21:10:59+08:00[Asia/Shanghai]
System.out.println(zonedDateTime2);
3. 总结
LocalDate, LocalTime, LocalDateTime, ZoneId之间的关系可以用一张图解释:
- 购物车案例【简单版】
- 再学习之MyBatis.
- 用户登陆注册【JDBC版】
- 学习思考之《编程之美》.
- 干货 | 深度剖析服务发现组件Netflix Eureka
- 多线程编程学习一(Java多线程的基础).
- TensorFlow | 自己动手写深度学习模型之全连接神经网络
- 多线程编程学习二(对象及变量的并发访问).
- ASM基本配置问题(r5笔记第89天)
- 如何上手使用 Facebook 的开源平台 Detectron?
- 多线程编程学习三(线程间通信).
- 关于create database语句在10g,11g中的不同(r5笔记第88天)
- Web开发模式【Mode I 和Mode II的介绍、应用案例】
- 多线程编程学习四(Lock 的使用)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释