多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java 8 – `TemporalAdjusters` > 原文: [https://howtodoinjava.com/java/date-time/java8-temporal-adjusters/](https://howtodoinjava.com/java/date-time/java8-temporal-adjusters/) 学习使用 [Java 8](https://howtodoinjava.com/java-8-tutorial/) [**`TemporalAdjusters`**](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html),我们要在其中处理**重复日期**,例如处理每周报告,发送每月自动报告, 等等 ## 1\. `TemporalAdjuster`接口 [`TemporalAdjuster`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjuster.html)接口和`TemporalAdjusters`工厂类提供了许多有用的**内置调节器**,用于处理重复事件。 其中大多数名称直接告诉您它们的作用。 如果提供的调整器无法解决任何特定的业务需求,我们可以构建自己的**自定义`TemporalAdjuster`**。 然后,我们可以使用该日期/时间对象的[`with()`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#with-java.time.temporal.TemporalAdjuster-)方法将其应用于任何时间对象。 例如,在团队中,总是每个星期一都有每周一次的会议。 我们想获取接下来的 5 次会议的日期列表。 ```java import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; public class TemporalAdjusterExamples { public static void main(String[] args) { LocalDate localDate = LocalDate.of(2020, 5, 9); List<LocalDate> meetingDates = getWeeklyMeetingDates(localDate, 5); System.out.println(meetingDates); } private static List<LocalDate> getWeeklyMeetingDates(LocalDate localDate, int count) { List<LocalDate> dates = new ArrayList<>(); for(int i = 0; i < count; i++) { localDate = localDate .with(TemporalAdjusters.next(DayOfWeek.MONDAY)); dates.add(localDate); } return dates; } } ``` 程序输出。 ```java [2020-05-11, 2020-05-18, 2020-05-25, 2020-06-01, 2020-06-08] ``` ## 2\. 内置调节器 这是方便使用的默认提供的调节器的列表。 访问官方 Java 文档以获取详细信息。 | 调节器 | 描述 | | --- | --- | | `firstDayOfMonth()` | 返回一个新日期,将其设置为当前月份的第一天。 | | `lastDayOfMonth()` | 返回一个新日期,将其设置为当前月份的最后一天。 | | `firstDayOfNextMonth()` | 返回一个新日期,将其设置为下个月的第一天。 | | `firstDayOfYear()` | 返回一个新日期,将其设置为当年的第一天。 | | `lastDayOfYear()` | 返回一个新日期,将其设置为当年的最后一天。 | | `firstDayOfNextYear()` | 返回一个新日期,将其设置为明年的第一天。 | | `firstInMonth()` | 返回同月的第一个匹配日期的新日期。 例如“ 5 月的第一个星期三”。 | | `lastInMonth()` | 返回与上一个匹配的星期几相同的月份中的新日期。 | | `dayOfWeekInMonth()` | 返回与月份中的星期几相同的月份中的新日期。 | | `next()` | 将日期返回到调整日期后指定的星期几的第一个匹配项。 | | `previous()` | 将日期返回到调整日期之前指定的星期几的第一个匹配项。 | ## 3\. 创建自定义的`TemporalAdjuster` 创建一个自定义调整器,该调整器可用于将重复日期调整为某些业务逻辑。 它可以通过两种方式完成: * 实现`TemporalAdjuster`接口 * 内联 Lambda 表达式 > ```java //Custom temporal adjuster with lambda TemporalAdjuster temporalAdjuster = t -> t.plus(Period.ofDays(7)); //Custom temporal adjuster with TemporalAdjuster interface class NextBirthDay implements TemporalAdjuster { @Override public Temporal adjustInto(Temporal temporal) { return temporal.with(ChronoField.MONTH_OF_YEAR, 11) .with(ChronoField.DAY_OF_MONTH, 22); } } ``` 在评论中向我发送有关将 Java 8 `TemporalAdjuster`用于日期操作的问题和建议。 学习愉快! [下载源码](https://github.com/lokeshgupta1981/Core-Java/tree/master/src/com/howtodoinjava/core/datetime)