【语言】Java 日期 API 的使用技巧

前言 在日常开发中,我们经常会使用到一些有关日期相关的数据操作,比如:获取日期对应周几、获取一个月中存在等获取时间的操作。
而在 Java 8 之前的日期 API 设计是非常反人类的。使用 new Date() 创建的时间,获取年份的时候,是通过从1900开始1计算,而且获取的月份0代表1月份。并且使用时无法保证线程安全,多个线程操作时,可能会出问题。
到了 Java 8 将时间的 API 进行重新的设计,明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类,而且所有类是不可变的,保证了使用中线程安全问题。
本文将对开发中常用的案例,进行讲解,方便大家高效开发。
核心类 Java 8 日期时间的默认格式如下:yyyy-MM-dd-HH-mm-ss.zzz
几个主要的核心类:

  • LocalDate:表示日期类,不包含时间时分秒
  • LocalTime:表示时间类,不包含日期月日年
  • LocalDateTime:表示日期和时间类
  • ZonedDateTime:表示时区日期时间类
  • OffsetDateTime:表示按 UTC 时间偏移来得到日期时间
  • Clock:表示获取某个时区下当前的瞬时时间,日期或者时间
  • Instant:表示Unix时间,代表时间戳,比如2018-01-14T02:20:13.592Z
  • Duration:表示两个时间之间,表示一个绝对的精确跨度,使用毫秒为单位
  • Period:表示两个日期之间
  • ZoneId:表示时区
  • DateTimeFormatter:表示格式化输出
  • TemporalAdjusters:表示获得指定日期时间等,如当月的第一天、今年的最后一天等等
常用案例 获取今日的日期 使用 LocalDate 对象的 now() 可以直接拿到今日的日期。然后通过 DateTimeFormatter 可以对日期进行格式化打印。
LocalDate localDate = LocalDate.now(); System.out.println("今天日期是:"+localDate); DateTimeFormatter fmtDate = DateTimeFormatter.ofPattern("yyyyMMdd"); System.out.println("今天日期格式化:"+localDate.format(fmtDate)); /** * -------- 打印 -------- * 今天日期是:2021-11-12 * 今天日期格式化:20211112 */

获取日期中的年月日
LocalDate localDate = LocalDate.now(); int year = localDate.getYear(); int month = localDate.getMonthValue(); int day = localDate.getDayOfMonth(); System.out.println("年:"+year); System.out.println("月:"+month); System.out.println("日:"+day); /** * -------- 打印 -------- *年:2021 *月:11 *日:12 */

比较不同日期 LocalDate 对象可以通过 equals() / isAfter() / isBefore() 方法对日期进行比较,非常方便。
LocalDate localDate = LocalDate.now(); LocalDate localDateOther = LocalDate.of(2021,11,11); System.out.println("localDate 等于 localDateOther:"+localDate.equals(localDateOther)); System.out.println("localDate 大于 localDateOther:"+localDate.isAfter(localDateOther)); System.out.println("localDate 小于 localDateOther:"+localDate.isBefore(localDateOther)); /** * -------- 打印 -------- *localDate 等于 localDateOther:false *localDate 大于 localDateOther:true *localDate 小于 localDateOther:false */

获取当前时间 使用 LocalTime 对象的 now() 可以直接拿到今日的时间,不包含日期。
LocalTime nowTime = LocalTime.now(); System.out.println("当前时间为:"+nowTime); /** * -------- 打印 -------- *当前时间为:12:56:17.908 */

日期时间的计算 【【语言】Java 日期 API 的使用技巧】使用 LocalTime 对象的 now() 可以直接拿到今日的时间,不包含日期。
LocalDate localDate = LocalDate.of(2021,11,11); LocalTime nowTime = LocalTime.now(); LocalDate tempDate; LocalTime tempTime; tempDate = localDate.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).minusDays(7); System.out.println("今年双11上周周一是:"+tempDate); DayOfWeek dayOfWeek = localDate.getDayOfWeek(); System.out.println("今年双11是周几?:"+dayOfWeek); tempTime = nowTime.plusHours(5).plusMinutes(20); System.out.println("五小时20分钟后是:"+tempTime); tempTime = nowTime.minusHours(3); System.out.println("3小时前是:"+tempTime); /** * -------- 打印 -------- *今年双11上周周一是:2021-11-01 *今年双11是周几?:THURSDAY *五小时20分钟后是:18:28:44.508 *3小时前是:10:08:44.508 */

计算两个日期之间的间隔 使用 LocalTime 对象的 now() 可以直接拿到今日的时间,不包含日期。
LocalDate localDate = LocalDate.of(2019,5,1); LocalDate localDateOther = LocalDate.of(2021,11,11); Period period = Period.between(localDate, localDateOther); System.out.println("Years:" + period.getYears() +" months:" + period.getMonths() +" days:"+period.getDays()); /** * -------- 打印 -------- *Years:2 months:6 days:10 */

总结 通过 LocalDateLocalTime 的使用,可以对于常见的业务场景的时间日期进行高效的计算,更多还是自己去动手去实践吧。

    推荐阅读