原文: https://howtodoinjava.com/java/date-time/java8-temporal-adjusters/

学习使用 Java 8 TemporalAdjusters,我们要在其中处理重复日期,例如处理每周报告,发送每月自动报告, 等等

1. TemporalAdjuster接口

TemporalAdjuster接口和TemporalAdjusters工厂类提供了许多有用的内置调节器,用于处理重复事件。 其中大多数名称直接告诉您它们的作用。

如果提供的调整器无法解决任何特定的业务需求,我们可以构建自己的自定义TemporalAdjuster

然后,我们可以使用该日期/时间对象的with()方法将其应用于任何时间对象。

例如,在团队中,总是每个星期一都有每周一次的会议。 我们想获取接下来的 5 次会议的日期列表。

  1. import java.time.DayOfWeek;
  2. import java.time.LocalDate;
  3. import java.time.temporal.TemporalAdjusters;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class TemporalAdjusterExamples
  7. {
  8. public static void main(String[] args)
  9. {
  10. LocalDate localDate = LocalDate.of(2020, 5, 9);
  11. List<LocalDate> meetingDates = getWeeklyMeetingDates(localDate, 5);
  12. System.out.println(meetingDates);
  13. }
  14. private static List<LocalDate>
  15. getWeeklyMeetingDates(LocalDate localDate, int count)
  16. {
  17. List<LocalDate> dates = new ArrayList<>();
  18. for(int i = 0; i < count; i++)
  19. {
  20. localDate = localDate
  21. .with(TemporalAdjusters.next(DayOfWeek.MONDAY));
  22. dates.add(localDate);
  23. }
  24. return dates;
  25. }
  26. }

程序输出。

  1. [2020-05-11,
  2. 2020-05-18,
  3. 2020-05-25,
  4. 2020-06-01,
  5. 2020-06-08]

2. 内置调节器

这是方便使用的默认提供的调节器的列表。 访问官方 Java 文档以获取详细信息。

调节器 描述
firstDayOfMonth() 返回一个新日期,将其设置为当前月份的第一天。
lastDayOfMonth() 返回一个新日期,将其设置为当前月份的最后一天。
firstDayOfNextMonth() 返回一个新日期,将其设置为下个月的第一天。
firstDayOfYear() 返回一个新日期,将其设置为当年的第一天。
lastDayOfYear() 返回一个新日期,将其设置为当年的最后一天。
firstDayOfNextYear() 返回一个新日期,将其设置为明年的第一天。
firstInMonth() 返回同月的第一个匹配日期的新日期。 例如“ 5 月的第一个星期三”。
lastInMonth() 返回与上一个匹配的星期几相同的月份中的新日期。
dayOfWeekInMonth() 返回与月份中的星期几相同的月份中的新日期。
next() 将日期返回到调整日期后指定的星期几的第一个匹配项。
previous() 将日期返回到调整日期之前指定的星期几的第一个匹配项。

3. 创建自定义的TemporalAdjuster

创建一个自定义调整器,该调整器可用于将重复日期调整为某些业务逻辑。 它可以通过两种方式完成:

  • 实现TemporalAdjuster接口

  • 内联 Lambda 表达式

  1. //Custom temporal adjuster with lambda
  2. TemporalAdjuster temporalAdjuster = t -> t.plus(Period.ofDays(7));
  3. //Custom temporal adjuster with TemporalAdjuster interface
  4. class NextBirthDay implements TemporalAdjuster
  5. {
  6. @Override
  7. public Temporal adjustInto(Temporal temporal)
  8. {
  9. return temporal.with(ChronoField.MONTH_OF_YEAR, 11)
  10. .with(ChronoField.DAY_OF_MONTH, 22);
  11. }
  12. }


在评论中向我发送有关将 Java 8 TemporalAdjuster用于日期操作的问题和建议。
学习愉快!
下载源码