# 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)。