写点什么

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

  • 2021 年 11 月 22 日
  • 本文字数:2044 字

    阅读完需:约 7 分钟

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

作者:幻好

来源:恒生LIGHT云社区

前言

在日常开发中,我们经常会使用到一些有关日期相关的数据操作,比如:获取日期对应周几、获取一个月中存在等获取时间的操作。


而在 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 */
复制代码

日期时间的计算

使用 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 的使用,可以对于常见的业务场景的时间日期进行高效的计算,更多还是自己去动手去实践吧。

发布于: 1 小时前阅读数: 4
用户头像

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
【语言】Java 日期 API 的使用技巧