Java TemporalAdjusters日期调整器的用法(附带实例)
对于日程安排应用来说,通常需要计算日期,例如每月的第一个星期二。TemporalAdjusters 类提供了许多用于常见调整的静态方法。可以将调整方法的结果传递给 with 方法。
例如,一个月的第一个星期二可以这样计算:
下表显示了可用的调整器:
还可以通过实现 TemporalAdjuster 接口来创建自己的调整器。下面是用于计算下一个工作日的调整器:
这里我们将调整器指定为 Lambda 表达式:
例如,一个月的第一个星期二可以这样计算:
LocalDate firstTuesday = LocalDate.of(year, month, 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));一如既往,with() 方法返回一个新的 LocalDate 对象,而不修改原来的对象。
下表显示了可用的调整器:
方法 | 功能描述 |
---|---|
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; });