首页 > 编程笔记 > Java笔记 阅读:9

Java TemporalAdjusters日期调整器的用法(附带实例)

对于日程安排应用来说,通常需要计算日期,例如每月的第一个星期二。TemporalAdjusters 类提供了许多用于常见调整的静态方法。可以将调整方法的结果传递给 with 方法。

例如,一个月的第一个星期二可以这样计算:
LocalDate firstTuesday = LocalDate.of(year, month, 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));
一如既往,with() 方法返回一个新的 LocalDate 对象,而不修改原来的对象。

下表显示了可用的调整器:

表:TemporalAdjusters 类的日期调节器
方法 功能描述
next(weekday), nextOrSame(weekday), previous(weekday), previousOrSame(weekday) 将日期调整为给定的星期日期
dayOfWeekInMonth(n, weekday) 当月的第 n 个 weekday
lastInMonth(weekday) 当月最后一个 weekday
firstDayOfMonth(), firstDayOfNextMonth(), firstDayOfYear(), firstDayOfNextYear(), lastDayOfMonth(), lastDayOfPreviousMonth(), lastDayOfYear() 方法名中描述的日期

还可以通过实现 TemporalAdjuster 接口来创建自己的调整器。下面是用于计算下一个工作日的调整器:
TemporalAdjuster NEXT_WORKDAY = w -> {
     var result = (LocalDate) w;
do {
     result = result.plusDays(1);
} while (result.getDayOfWeek().getValue() >= 6);
     return result;
};
LocalDate backToWork = today.with(NEXT_WORKDAY);
需要注意的是,Lambda 表达式的参数类型为 Temporal,必须将其强制转换为 LocalDate。可以使用 ofDateAdjuster() 方法来避免这个强制转换,该方法需要 UnaryOperator<LocalDate> 类型的参数。

这里我们将调整器指定为 Lambda 表达式:
TemporalAdjuster NEXT_WORKDAY = TemporalAdjusters.ofDateAdjuster(w -> {
LocalDate result = w; // No cast
do {
     result = result.plusDays(1);
} while (result.getDayOfWeek().getValue() >= 6);
     return result;
});

相关文章