前提

前面通过五篇文章基本介绍完JSR-310常用的日期时间API以及一些工具类,这篇博文主要说说笔者在生产实战中使用JSR-310日期时间API的一些经验。

系列文章:

不经意间,JDK8发布已经超过6年了,如果还在用旧的日期时间API,可以抽点时间熟悉一下JSR-310的日期时间API。

前提

前面的几篇文章已经基本介绍完了JSR-310日期时间类库的基本使用,这篇文章主要介绍在主流的框架中如何使用这些类库。因为涉及到数据库操作,先准备好一张表和对应的实体。

1
2
3
4
5
6
7
8
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 '用户表';
1
2
3
4
5
6
7
8
@Data
public class User{

private Long id;
private String name;
private LocalDate birthday;
private OffsetDateTime createTime;
}

这里如果不考虑时区的影响,createTime也可以使用LocalDateTime类型。另外,为了连接测试数据库,这里引入’光’连接池的依赖:

1
2
3
4
5
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.2.0</version>
</dependency>

前提

前一篇文章已经比较详细地介绍了JSR-310中新增的常用的日期时间类,在实际应用中,我们也十分关注这些日期时间类的格式化操作,更加通俗来说就是字符串和日期时间类的相互转换问题。下面先回顾一下Java旧有的日期时间类和字符串之间的转换方案,然后重点分析JSR-310中新增的常用的日期时间类和字符串之间的转换方案。

JSR310新日期API(二)-日期时间API

前提

这篇文章主要介绍一下日期时间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的时间偏移量)的日期时间表示。

其他的类库还有YearMonthDayOfWeekMonthDayYearMonth等。值得注意的是:JSR-310增加的日期API是严格区分年月日-时分秒格式的日期表示类,例如XXXDateTime一定表示为年月日时分秒(纳秒),XXXTime只能表示时分秒(纳秒),XXXDate只能表示年月日。

值得注意的是:这些新增的日期时间类都是不可变类,每次通过其方法更变或者修改都是返回一个全新的对象,因此它们都是线程安全的。