# Java `TemporalAdjusters`教程

原文：http://zetcode.com/java/temporaladjusters/

Java `TemporalAdjusters`教程展示了如何使用`TemporalAdjusters`修改 Java 中的`Temporal`对象。

时间是日期，时间和偏移对象的基本接口类型，包括`LocalDate`，`LocalTime`，`LocalDateTime`和`Instant`。

## Java `TemporalAdjusters`

`TemporalAdjusters`用于修改时间对象。 他们允许查找星期，月份或年份的第一天或最后一天； 一周的第二天或下一天，依此类推。

## Java `TemporalAdjusters`示例

以下示例使用内置的`TemporalAdjusters`方法。

`JavaTemporalAdjustersEx.java`

```java
package com.zetcode;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class JavaTemporalAdjustersEx {

    public static void main(String[] args) {

        var localDate = LocalDate.now();
        System.out.printf("today: %s%n", localDate);

        var date1 = localDate.with(TemporalAdjusters.firstDayOfMonth());
        System.out.printf("first day of month: %s%n", date1);

        var date2 = localDate.with(TemporalAdjusters.lastDayOfMonth());
        System.out.printf("last day of month: %s%n", date2);

        var date3 = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        System.out.printf("next Monday: %s%n", date3);

        var date4 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
        System.out.printf("first day of next month: %s%n", date4);

        var date5 = localDate.with(TemporalAdjusters.lastDayOfYear());
        System.out.printf("last day of year: %s%n", date5);

        var date6 = localDate.with(TemporalAdjusters.firstDayOfYear());
        System.out.printf("first day of year: %s%n", date6);

        var date7 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
        System.out.printf("last Sunday of month: %s%n", date7);
    }
}

```

该示例介绍了七个时间调节器。

```java
var localDate = LocalDate.now();

```

我们使用`LocalDate.now()`计算当前本地日期。

```java
var date1 = localDate.with(TemporalAdjusters.firstDayOfMonth());

```

使用`firstDayOfMonth()`，我们可以找到当月的第一天。

```java
var date2 = localDate.with(TemporalAdjusters.lastDayOfMonth());

```

使用`lastDayOfMonth()`，我们可以找到该月的最后一天。

```java
var date3 = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));

```

使用`next()`和`DayOfWeek.MONDAY`，我们找到下一个星期一。

```java
var date4 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());

```

使用`firstDayOfNextMonth()`，我们可以找到下个月的第一天。

```java
var date5 = localDate.with(TemporalAdjusters.lastDayOfYear());

```

使用`lastDayOfYear()`，我们可以找到一年中的最后一天。

```java
var date6 = localDate.with(TemporalAdjusters.firstDayOfYear());

```

使用`firstDayOfYear()`，可以找到一年的第一天。

```java
var date7 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));

```

使用`lastInMonth()`和`DayOfWeek.SUNDAY`，我们可以找到该月的最后一个星期日。

```java
today: 2018-12-03
first day of month: 2018-12-01
last day of month: 2018-12-31
next monday: 2018-12-10
first day of next month: 2019-01-01
last day of year: 2018-12-31
first day of year: 2018-01-01
last Sunday of month: 2018-12-30

```

这是输出。

## Java 自定义`TemporalAdjuster`

我们可以创建我们的自定义时间调整器。

`JavaCustomTemporalAdjusterEx.java`

```java
package com.zetcode;

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.TemporalAdjuster;

public class JavaCustomTemporalAdjusterEx {

    public static void main(String[] args) {

        var localDate = LocalDate.of(2018, 12, 3);

        TemporalAdjuster taj = t -> t.plus(Period.ofDays(14));
        var result = localDate.with(taj);

        System.out.printf("Adding 14 days to %s gives %s", 
            localDate, result);
    }
}

```

本示例使用`LocalDate.of()`创建日期。 它在日期上增加了 14 天并打印结果。

```java
TemporalAdjuster taj = t -> t.plus(Period.ofDays(14));

```

这是一个 lambda 表达式，它创建一个`TemporalAdjuster`，它向创建的日期对象增加 14 天。

```java
var result = localDate.with(taj);

```

我们得到结果。

```java
Adding 14 days to 2018-12-03 gives 2018-12-17

```

这是输出。

我们可以通过实现`TemporalAdjuster`接口来创建时间调整器。

`JavaCustomTemporalAdjusterEx2.java`

```java
package com.zetcode;

import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;

class NextChristmas implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {

        return temporal.with(ChronoField.MONTH_OF_YEAR, 12)
                .with(ChronoField.DAY_OF_MONTH, 25);

    }
}

public class JavaCustomTemporalAdjusterEx2 {

    public static void main(String[] args) {

        var now = LocalDate.now();
        System.out.println("Today: " + now);

        var xmas = now.with(new NextChristmas());
        System.out.println("Next XMas: " + xmas);
    }
}

```

在示例中，自定义`TemporalAdjuster`计算下一个 XMas 的日期。

```java
@Override
public Temporal adjustInto(Temporal temporal) {

    return temporal.with(ChronoField.MONTH_OF_YEAR, 12)
            .with(ChronoField.DAY_OF_MONTH, 25);
}

```

我们实现了`adjustInto()`方法，该方法返回 XMa 的`Temporal`对象，调用该方法的日期应调整为该对象。

```java
Today: 2018-12-03
Next XMas: 2018-12-25

```

这是输出。

在本教程中，我们使用 Java `TemporalAdjusters`完成了日期和时间的修改。

您可能对以下相关教程感兴趣： [Java 文件教程](/java/file/)， [Java `LocalTime`教程](/java/localtime/)， [Java 教程](/lang/java/)和 [Java Unix 时间教程](/java/unixtime)。