1. 概览
在本文中,我们介绍如何使用 Java 8 的 Duration,Period 和 ChronoUnit 计算两个日期之间间隔。
Duration 用来计算秒(seconds)和纳秒(nanoseconds)。
Period 用来计算年、月、日。
2. Duration 示例
Duration.between 获取两个 LocalDateTime 之间相差的秒数。
@Test
public void givenDuration_whenGetSeconds_thenOk() {
System.out.println("--- Duration.getSeconds ---");
Duration oneHour = Duration.ofHours(1);
System.out.println(oneHour.getSeconds() + " seconds");
Duration oneHour2 = Duration.of(1, ChronoUnit.HOURS);
System.out.println(oneHour2.getSeconds() + " seconds");
System.out.println("\n--- Duration.between ---");
LocalDateTime localDateTime1 = LocalDateTime.of(2020, Month.NOVEMBER, 30, 9, 02, 01);
LocalDateTime localDateTime2 = LocalDateTime.of(2020, Month.DECEMBER, 2, 9, 02, 01);
System.out.println(localDateTime1);
System.out.println(localDateTime2);
Duration duration = Duration.between(localDateTime1, localDateTime2);
System.out.println(duration.getSeconds() + " seconds");
assertEquals(duration.getSeconds(), 24 * 60 * 60 * 2);
}
输出:
--- Duration 示例 ---
3600 seconds
3600 seconds
--- Duration.between ---
2020-11-30T09:02:01
2020-12-02T09:02:01
3. Period 示例
Period.between 获取两个 LocalDate 之间相差的年、月、日。
@Test
public void givenPeriod_whenBetween_thenOk() {
System.out.println("--- Period 示例 ---");
Period tenDays = Period.ofDays(10);
System.out.println(tenDays.getDays() + " days");
Period oneYearTwoMonthsThreeDays = Period.of(1, 2, 3);
System.out.println(oneYearTwoMonthsThreeDays.getYears() + " years");
System.out.println(oneYearTwoMonthsThreeDays.getMonths() + " months");
System.out.println(oneYearTwoMonthsThreeDays.getDays() + " days");
System.out.println("\n--- Period.between ---");
LocalDate localDate1 = LocalDate.of(2020, Month.NOVEMBER, 30);
LocalDate localDate2 = LocalDate.of(2021, Month.DECEMBER, 2);
System.out.println(localDate1);
System.out.println(localDate2);
Period period = Period.between(localDate1, localDate2);
System.out.println(period.getYears() + " years");
System.out.println(period.getMonths() + " months");
System.out.println(period.getDays() + " days");
assertEquals(period.getDays(), 2);
}
输出:
--- Period 示例 ---
10 days
1 years
2 months
3 days
--- Period.between ---
2020-11-30
2021-12-02
1 years
0 months
2 days
4. ChronoUnit 示例
Period.between 获取两个 LocalDate 之间相差的年、月、日。
@Test
public void givenChronoUnit_whenBetween_thenOk() {
System.out.println("--- ChronoUnit.{unit}.between 示例 --- ");
LocalDateTime localDateTime1 = LocalDateTime.of(2020, Month.NOVEMBER, 30, 9, 02, 01);
LocalDateTime localDateTime2 = LocalDateTime.of(2020, Month.DECEMBER, 2, 9, 02, 01);
System.out.println(localDateTime1);
System.out.println(localDateTime2);
long years = ChronoUnit.YEARS.between(localDateTime1, localDateTime2);
long months = ChronoUnit.MONTHS.between(localDateTime1, localDateTime2);
long weeks = ChronoUnit.WEEKS.between(localDateTime1, localDateTime2);
long days = ChronoUnit.DAYS.between(localDateTime1, localDateTime2);
long hours = ChronoUnit.HOURS.between(localDateTime1, localDateTime2);
long minutes = ChronoUnit.MINUTES.between(localDateTime1, localDateTime2);
long seconds = ChronoUnit.SECONDS.between(localDateTime1, localDateTime2);
long millis = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2);
long nanos = ChronoUnit.NANOS.between(localDateTime1, localDateTime2);
System.out.println("\n--- Total --- ");
System.out.println(years + " years");
System.out.println(months + " months");
System.out.println(weeks + " weeks");
System.out.println(days + " days");
System.out.println(hours + " hours");
System.out.println(minutes + " minutes");
System.out.println(seconds + " seconds");
System.out.println(millis + " millis");
System.out.println(nanos + " nanos");
assertEquals(hours, 24 * 2);
}
输出:
--- ChronoUnit.{unit}.between 示例 ---
2020-11-30T09:02:01
2020-12-02T09:02:01
--- Total ---
0 years
0 months
0 weeks
2 days
48 hours
2880 minutes
172800 seconds
172800000 millis
172800000000000 nanos
5. 总结
本文介绍了 Java 8 Date/Time API 中的 Duration,Period 和 ChronoUnit 用法。
文章中用到的示例代码,在 Gitee 中可以快速查看、下载。
git clone git@gitee.com:niuge6/learning-java.git
cd core-java-modules/core-java-8-datetime