四时宝库

程序员的知识宝库

Java 8 Period 和 Duration 用法示例

1. 概览

在本文中,我们介绍如何使用 Java 8 的 DurationPeriodChronoUnit 计算两个日期之间间隔。

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 中的 DurationPeriodChronoUnit 用法。

文章中用到的示例代码,在 Gitee 中可以快速查看、下载。

git clone git@gitee.com:niuge6/learning-java.git

cd core-java-modules/core-java-8-datetime

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接