头图

前言

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

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


恒生LIGHT云社区
46 声望7 粉丝

LIGHT云是恒生公司旗下云服务品牌,聚焦金融行业生态圈,依托恒生公司24年技术创新及研发积累,不断探索金融行业各场景的落地和应用,提供一站式云计算行业解决方案。