# Java 8 – `Period`

> 原文： [https://howtodoinjava.com/java/date-time/java8-period/](https://howtodoinjava.com/java/date-time/java8-period/)

在[ ISO-8601 日历系统](https://www.iso.org/iso-8601-date-and-time-format.html)中，使用 [Java 8](https://howtodoinjava.com/java-8-tutorial/) `Period`类，在基于日期的值（例如天，月，年，周或年）中学习查找两个日期之间的**差异**。

## 1\. `Period`类

`Period`类用于使用 ISO-8601 时间段格式`PnYnMnD`和`PnW`中基于日期的值来表示时间量。 例如，`P20Y2M25D`字符串代表 20 年，2 个月和 25 天。

此时间段可以通过不同方式获得。

#### 1.1 `Period.between()`

通常，`Period`用于表示两个日期之间的时间段（例如，两个[`LocalDate`](https://howtodoinjava.com/java/date-time/java-time-localdate-class/)实例之间的时间段）。

```java
LocalDate startLocalDate = LocalDate.of(2020, 3, 12);
LocalDate endLocalDate = LocalDate.of(2020, 7, 20);

Period periodBetween = Period.between(startLocalDate, endLocalDate);
System.out.println(periodBetween);	// P4M8D - 4 months and 8 days

System.out.println(periodBetween.getDays());		//8
System.out.println(periodBetween.getMonths());		//4
System.out.println(periodBetween.getYears());		//0

System.out.println(periodBetween.get(ChronoUnit.DAYS));	//8

```

#### 1.2 `Period.ofDays()`

`Period`分类以下方法，以不同单位表示时间段：

*   **`ofDays(int days)`** – 表示天数的时间段。
*   **`ofMonths(int months)`** – 表示月数的时间段。
*   **`ofWeeks(int weeks)`** – 表示周数的时间段。
*   **`ofYears(int years)`** – 表示年数的时间段。

```java
Period fromDays = Period.ofDays(150);	// 150 days
Period fromMonths = Period.ofMonths(4);	// 4 months
Period fromYears = Period.ofYears(10);	// 10 years
Period fromWeeks = Period.ofWeeks(15);	// 15 weeks

```

#### 1.3 `Period.of()`

使用`of(int years, int months, int days)`，我们可以获得基于年，月和日的实例。

```java
//20 years, 3 months and 20 days
Period periodFromUnits = Period.of(20, 3, 20);

```

#### 1.4 `Period.parse()`

可以从包含 ISO-8601 时间段格式的`String`中获得`Period`。

```java
//20 years, 3 months and 20 days
Period periodFromString1 = Period.parse("P20Y3M20D");

//365 Days
Period periodFromString2 = Period.parse("P365D");

//52 Weeks
Period periodFromString3 = Period.parse("P52W");

```

## 2\. 获取`Period`值

时间段值可以通过获取器方法获得：

*   **`Period.getDays()`** - 获取此时间段的天数。
*   **`Period.getMonths()`** - 获取此时间段的月数。
*   **`Period.getYears()`** - 获取此时间段的年数。
*   **`Period.get(TemporalUnit unit)`** - 获取所请求单位的值。 请注意，支持的单位是`YEARS, MONTHS, DAYS`。 所有其他单元都抛出`UnsupportedTemporalTypeException`。

```java
LocalDate startLocalDate = LocalDate.of(2020, 3, 12);
LocalDate endLocalDate = LocalDate.of(2020, 7, 20);

Period periodBetween = Period.between(startLocalDate, endLocalDate);

System.out.println(periodBetween.getDays());		//8
System.out.println(periodBetween.getMonths());		//4
System.out.println(periodBetween.getYears());		//0

System.out.println(periodBetween.get(ChronoUnit.DAYS));	//8

//Throws UnsupportedTemporalTypeException
System.out.println(periodBetween.get(ChronoUnit.WEEKS));	

```

## 3\. 修改`Period`

我们可以从给定的`Period`对象中添加或减去一段时间。 支持加减法的方法有：

*   **`add(Period)`** – 返回给定时间段的副本，其中添加了指定的时间段。
*   **`plusYears()`** – 返回给定时间段的副本，其中添加了指定的年份。
*   **`plusMonths()`** – 返回给定时间段的副本，其中添加了指定的月份。
*   **`plusDays()`** – 返回给定时间段的副本，其中添加了指定的日期。
*   **`minus(period)`**-返回给定时间段的副本，减去指定时间段。
*   **`minusYears()`**-返回给定时间段的副本，其中减去指定的年份。
*   **`minusMonths()`** – 返回给定时间段的副本，其中减去指定的月份。
*   **`minusDays()`** – 返回给定时间段的副本，其中减去指定天数。
*   **`multipliedBy(scalar)`** – 返回一个新实例，该实例中的每个元素都乘以指定的标量。

```java
Period period = Period.ofDays(5);

Period periodDaysAdded = period.plus(5);
Period periodPlus1Year = period.plusYears(1L);

```

在评论中向我发送有关将 Java 8 时间段用于日期差异的问题和建议。

学习愉快！

[下载源码](https://github.com/lokeshgupta1981/Core-Java/tree/master/src/com/howtodoinjava/core/datetime)