# JDK 8 及其后续 JDK 中 Period 和 Duration

**URL:** <https://www.isharkfly.com/t/jdk-8-jdk-period-duration/13709>\
**Category:** 程序语言\
**Tags:** java\
**Created:** [September 1, 2021, 3:53pm UTC](https://www.isharkfly.com/t/jdk-8-jdk-period-duration/13709 "2021-09-01T15:53:47Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [September 1, 2021, 3:53pm UTC](https://www.isharkfly.com/t/jdk-8-jdk-period-duration/13709/1 "2021-09-01T15:53:47Z")

</div>

我们都知道 JDK 8 以后开始使用了新的 joda 日期处理 API。

在这个 API 中，新增了 Period 和 Duration 这 2 个类，用于计算 2 个日期之间的间隔。

![9220830a0f1b373e4d5cba07d41ca7357e67c522](https://www.isharkfly.com/images/transparent.png)

下面对这 2 个类进行一些比较和说明，从使用上来说，如果你不需要秒或者纳秒一级的比较的话，就用 Period ，Period 的比较粒度更粗，通常只能精确到，天（Days），月（Months）和 年（Years）。

Duration 是按照纳秒级别的比较，通常会非常精确，不会丢精度，Period 有可能会丢精度。

## 线程安全和可变

这 2 个类都是：

- 线程安全（thread-safe）
- 不可变（immutable）

## 对比和区别

2 个类比较的精度不不同。

Period 包含年数，月数，天数，而 Duration 只包含秒，纳秒。  
Period 只能返回年数，月数，天数；Duration可以返回天数，小时数，分钟数，毫秒数等。

2 个类可以使用的类型不同。  
Period 只能使用 LocalDate，换句话说 Period 只能使用 Date 对象。

Duration 是可以使用 Instant 对象的。

例如下面的代码：

```auto
Instant t1, t2;
...
long ns = Duration.between(t1, t2).toNanos();

```

将会计算 2 个时间之间的纳秒的不同。

考察下面计算生日的代码：

```auto
Period p = Period.between(birthday, today);
        long p2 = ChronoUnit.DAYS.between(birthday, today);
        System.out.println("You are " + p.getYears() + " years, " + p.getMonths() +
                " months, and " + p.getDays() +
                " days old. (" + p2 + " days total)");

```

代码将会输出为：

`You are 41 years, 8 months, and 0 days old. (15219 days total)`

因为我们在生日和日期的计算的时候，并不需要非常高的精度，因此上面的代码是不是非常方便？

再也不用受到老的 Java 日期 API 的折磨了。
