Java 8 新日期时间API

831 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

Java 8之前操作时间的api是线程不安全的, 为了解决这个问题在Java 8中新增了LocalDateLocalTimeLocalDateTime。这三个类中内置了变更时间的方法(线程安全),并且内置了安全的格式化方法。

  • LocalDate: 年月日格式的时间类型
  • LocalTime时分秒格式的时间类型
  • LocalDateTime年月日时分秒格式的时间类型

创建

这三个APi的操作类似,下图为创建LocalDateTime的方法: image.png

使用示例

  1. 获取当前时间 调用静态方式now可以获取当前时间 image.png
  2. 创建指定时间 调用静态方式of可以创建指定时间 image.png
  3. 根据字符串创建 调用静态方式parse可以解析字符串创建时间 image.png
  4. 根据时态对象创建 根据时态对象LocalDateLocalTimeLocalDateTime等创建 image.png

修改

LocalDateLocalTimeLocalDateTime都实现了Temporal接口,这个接口定义了修改时间的方法如下图:

image.png

调用修改方法不会修改原来的实例,而是返回一个新的实例。也正是如此才保证了线程安全

使用示例

image.png

image.png

image.png

格式化

调用LocalDateLocalTimeLocalDateTimeformat方法可以将实例格式化成指定的字符串。

使用示例

image.png

比较

LocalDateLocalTimeLocalDateTime中可以使用compareToisAfterisBefore进行比较

  • compareTo:返回值负整数正整数,即此日期小于、等于或大于指定的日期
  • isAfter: 返回值为boolean, 此日期时间是否在指定的日期时间之后
  • isBefore: 返回值为boolean, 此日期时间是否在指定的日期时间之后 此外LocalDateLocalDateTime还可以使用isEqual比较两个日期是否相等

使用示例

image.png

获取年、月、日、星期几、时、分、秒

LocalDate中存在final修饰的年月日变量, LocalTime中存在final修饰的时分秒微秒变量。通过调用对应的get方法可以获取到对应的值。LocalDateTime存在LocalDateLocalTime属性也提供了对应的对应的get方法。如下:

  1. LocalDate image.png

  2. LocalTime image.png

  3. LocalDateTime image.png

使用示例

image.png

Date互转

DateLocalDateLocalTimeLocalDateTime没有直接互转的方法,需要借助Instant实现

Date

LocalDate需要先转成LocalDateTime才能转成Date

LocalDateTime localDateTime = LocalDateTime.now();
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
Date date = Date.from(instant);

LocalDate localDate = LocalDate.now();
Instant instant1 = localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
Date date1 = Date.from(instant1);

DateLocalTimeLocalDateTime

image.png