TemporalAdjusters 是 Java8 中用于日期和时间操作的一个工具类,它通过静态方法提供了大量常用的 TemporalAdjuster 对象,以便执行各种日期校正操作。TemporalAdjuster 是一个函数式接口,其中定义了一个抽象方法 adjustInto(Temporal temporal),用于调整指定的 Temporal 对象。TemporalAdjuster 源码如下:
TemporalAdjusters 类提供的预定义静态方法如下:
firstDayOfMonth():获取当前月的第一天。
firstDayOfNextMonth():获取下月的第一天。
firstDayOfNextYear():获取明年的第一天。
firstDayOfYear():获取当年的第一天。
lastDayOfMonth():获取当月的最后一天,无需再计算当月是 28、29、30 还是 31 天。
lastDayOfNextMonth():获取下月的最后一天。
lastDayOfNextYear():获取明年的最后一天。
lastDayOfYear():获取当年的最后一天。
firstInMonth(DayOfWeek dayOfWeek):获取当月的第一个指定星期几。
lastInMonth(DayOfWeek dayOfWeek):获取当月的最后一个指定星期几。
dayOfWeekInMonth(int week, DayOfWeek dayOfWeek):获取当月第week周的指定星期几。
next(DayOfWeek dayOfWeek):获取当前日期之后(不包括当天)的第一个指定星期几的日期。如果当天就是该星期几,则返回下一周的该日。
nextOrSame(DayOfWeek dayOfWeek):获取当前日期之后(包括当天)的第一个指定星期几的日期。如果当天就是该星期几,则返回当天日期。
previous(DayOfWeek dayOfWeek):获取当前日期之前(不包括当天)的第一个指定星期几的日期。如果今天是该星期几,则返回上一周的该日。
previousOrSame(DayOfWeek dayOfWeek):获取当前日期之前(包括当天)的第一个指定星期几的日期。如果今天是该星期几,则返回当天日期。
该示例将介绍如何简单使用日期校正器 TemporalAdjusters,如查找本月最后一天、或者本月第一天。例如:
package com.hxstrive.jdk8.date_time.temporalAdjusters; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; /** * TemporalAdjusters 类 * @author hxstrive.com */ public class TemporalAdjustersDemo1 { public static void main(String[] args) { // 查找当前日期后第一个星期二 LocalDate firstTuesday = LocalDate.now() .with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)); System.out.println(firstTuesday); //2024-07-02 // 查找本月最后一天 LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); System.out.println(lastDay); //2024-06-30 // 查找本月第一天 LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); System.out.println(firstDay); //2024-06-01 } }
你可以通过实现 TemporalAdjuster 接口来实现自己的校正器。例如:
package com.hxstrive.jdk8.date_time.temporalAdjusters; import java.time.LocalDate; import java.time.temporal.TemporalAdjuster; /** * TemporalAdjusters 类 * @author hxstrive.com */ public class TemporalAdjustersDemo2 { public static void main(String[] args) { // 通过实现 TemporalAdjuster 接口来实现自己的校正器 // 下面是计算下一个工作日的校正器 TemporalAdjuster NEXT_WORKDAY = w -> { LocalDate result = (LocalDate) w; do { result = result.plusDays(1); } while (result.getDayOfWeek().getValue() >= 6); return result; }; LocalDate backToWork = LocalDate.now().with(NEXT_WORKDAY); System.out.println(backToWork); //2024-07-01 } }
注意,lambda 表达式的参数类型为 Temporal,它必须被强制转换为 LocalDate 对象。你可以通过 ofDateAdjuster 方法以及一个 Unaryoperator<LocalDate> 的 lambda 表达式,来避免该强制转换。例如:
package com.hxstrive.jdk8.date_time.temporalAdjusters; import java.time.LocalDate; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; /** * TemporalAdjusters 类 * @author hxstrive.com */ public class TemporalAdjustersDemo3 { public static void main(String[] args) { // 通过实现 TemporalAdjuster 接口来实现自己的校正器 // 下面是计算下一个工作日的校正器 TemporalAdjuster NEXT_WORKDAY = TemporalAdjusters.ofDateAdjuster(w ->{ LocalDate result = w; // 不需要进行转换 do { result = result.plusDays(1); } while(result.getDayOfWeek().getValue() >= 6); return result; }); LocalDate backToWork = LocalDate.now().with(NEXT_WORKDAY); System.out.println(backToWork); //2024-07-01 } }