前面通过五篇文章基本介绍完JSR-310
常用的日期时间API
以及一些工具类,这篇博文主要说说笔者在生产实战中使用JSR-310
日期时间API
的一些经验。
系列文章:
不经意间,JDK8发布已经超过6年了,如果还在用旧的日期时间API,可以抽点时间熟悉一下JSR-310的日期时间API。
前面的几篇文章已经基本介绍完了JSR-310日期时间类库的基本使用,这篇文章主要介绍在主流的框架中如何使用这些类库。因为涉及到数据库操作,先准备好一张表和对应的实体。
CREATE TABLE `t_user`(
id BIGINT PRIMARY KEY COMMENT '主键',
username VARCHAR(10) COMMENT '姓名',
birthday DATE COMMENT '生日',
create_time DATETIME COMMENT '创建时间',
KEY idx_name(`username`),
KEY idx_create_time(`create_time`)
)COMMENT '用户表';
@Data
public class User{
private Long id;
private String name;
private LocalDate birthday;
private OffsetDateTime createTime;
}
这里如果不考虑时区的影响,createTime
也可以使用LocalDateTime
类型。另外,为了连接测试数据库,这里引入’光’连接池的依赖:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.2.0</version>
</dependency>
这篇文章主要介绍JSR-310中日期时间类的常用计算工具,包括常规的两个日期时间实例之间的前后比较、间隔的时间量等等。
前一篇文章已经比较详细地介绍了JSR-310中新增的常用的日期时间类,在实际应用中,我们也十分关注这些日期时间类的格式化操作,更加通俗来说就是字符串和日期时间类的相互转换问题。下面先回顾一下Java旧有的日期时间类和字符串之间的转换方案,然后重点分析JSR-310中新增的常用的日期时间类和字符串之间的转换方案。
这篇文章主要介绍一下日期时间API中最常用的类库,分别是:
java.time.Clock
:时钟。java.time.Instant
:瞬时时间,时间戳java.sql.Timestamp
的替代类。java.time.LocalDate
:本地日期,ISO-8601日历系统下的日期表示,不包含时区的概念,只能表示年月日。java.time.LocalDateTime
:本地日期时间,ISO-8601日历系统下的日期时间表示,不包含时区的概念,只能表示年月日时分秒。java.time.LocalTime
:本地时间,ISO-8601日历系统下的时间表示,不包含时区的概念,只能表示时分秒。java.time.OffsetTime
:带有时间偏移量的时间,ISO-8601日历系统下的带有UTC/GMT时间偏移量的时间表示。java.time.OffsetDateTime
:带有时间偏移量的日期时间,ISO-8601日历系统下的带有UTC/GMT时间偏移量(不包含基于ZoneRegion
的时间偏移量)的日期时间表示。java.time.ZonedDateTime
:带有时间偏移量的日期时间,ISO-8601日历系统下的带有UTC/GMT时间偏移量(包含基于ZoneRegion
的时间偏移量)的日期时间表示。其他的类库还有Year
、Month
、DayOfWeek
、MonthDay
、YearMonth
等。值得注意的是:JSR-310
增加的日期API是严格区分年月日-时分秒格式的日期表示类,例如XXXDateTime一定表示为年月日时分秒(纳秒),XXXTime只能表示时分秒(纳秒),XXXDate只能表示年月日。
值得注意的是:这些新增的日期时间类都是不可变类,每次通过其方法更变或者修改都是返回一个全新的对象,因此它们都是线程安全的。
最近刚好有新项目使用到JSR-310(JDK8)
中引入的新日期API,打算做一下总结。本文编写基于JDK11
,部分API可能是JDK9
之后新增的。