Java日期类TemporalAdjuster使用说明
java 8 引入了新的日期、时间库————即java.time包,TemporalAdjuster 类是其中之一。
简而言之,TemporalAdjuster 类是调整Temporal对象的策略。在使用TemporalAdjuster 类之前,我们先看看Temporal接口。
Temporal 接口
Temporal可以根据实际需求表示为日期、时间或两者组合。其几个实现类包括:
LocalDate – 表示没有时区的日期
LocalDateTime – 表示没有时区的日期和时间
TemporalAdjuster 接口
TemporalAdjuster 是函数接口,在TemporalAdjusters 类中有很多预定义的实现。TemporalAdjuster仅有一个带Temporal对象参数的抽象方法adjustInto()。
TemporalAdjuster可以执行复杂的日期操作,例如,可以获得下一个星期日对于日期、当月的最后一天、下一年的第一天。当然也可以通过旧的java.util.Calendar api实现。不同的是,新api使用预定义的实现抽象出底层逻辑。
TemporalAdjusters类也有很多获取日期的方法,看代码:
static TemporalAdjuster dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
返回月份调整器中的星期几,它根据月份返回序号星期几的新日期。
static TemporalAdjuster firstDayOfMonth()
返回“第一天的月份”调整程序,它返回设置为当前月份第一天的新日期。
static TemporalAdjuster firstDayOfNextMonth()
返回“下个月的第一天”调整程序,它返回设置为下个月第一天的新日期。
static TemporalAdjuster firstDayOfNextYear()
返回“明年的第一天”调整器,它将新的日期设置为下一年的第一天。
static TemporalAdjuster firstDayOfYear()
返回“年中的第一天”调整程序,它返回设置为当前年度第一天的新日期。
static TemporalAdjuster firstInMonth(DayOfWeek dayOfWeek)
返回月份调整器中的第一个,它在同一个月中返回第一个匹配的星期几的新日期。
static TemporalAdjuster lastDayOfMonth()
返回“最后一天”调整器,它返回设置为当前月份最后一天的新日期。
static TemporalAdjuster lastDayOfYear()
返回“年末的最后一天”调整器,它返回设置为当前年度最后一天的新日期。
static TemporalAdjuster lastInMonth(DayOfWeek dayOfWeek)
返回月份调整器中的最后一个,它返回同一个月中与上一个匹配的星期几相关的新日期。
static TemporalAdjuster next(DayOfWeek dayOfWeek)
返回下一个星期几调整器,它将日期调整为调整日期后指定星期几的第一次出现。
static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek)
返回下一个或相同的星期几调整器,它将日期调整为调整日期后指定星期几的第一次出现,除非它已经在那一天,在这种情况下返回相同的对象。
static TemporalAdjuster ofDateAdjuster(UnaryOperator
获得包裹日期调整器的 TemporalAdjuster 。
static TemporalAdjuster previous(DayOfWeek dayOfWeek)
返回上一周的调整程序,该调整程序将日期调整为调整日期之前指定的星期几的第一次出现。
static TemporalAdjuster previousOrSame(DayOfWeek dayOfWeek)
返回上一个或同一个星期几的调整器,它将日期调整为调整日期之前指定的星期几的第一次出现,除非它已经在那一天,在这种情况下返回相同的对象。
LocalDateTime now = LocalDateTime.now();
//获取当月第一天
System.out.println("当月第一天:"+now.with(TemporalAdjusters.firstDayOfMonth()));
//获取下月第一天
System.out.println("下月第一天:"+now.with(TemporalAdjusters.firstDayOfNextMonth()));
//获取明年第一天
System.out.println("明年第一天:"+now.with(TemporalAdjusters.firstDayOfNextYear()));
//获取本年第一天
System.out.println("本年第一天:"+now.with(TemporalAdjusters.firstDayOfYear()));
//获取当月最后一天
System.out.println("当月最后一天:"+now.with(TemporalAdjusters.lastDayOfMonth()));
//获取本年最后一天
System.out.println("本年最后一天:"+now.with(TemporalAdjusters.lastDayOfYear()));
//获取当月第三周星期五
System.out.println("当月第三周星期五:"+now.with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.FRIDAY)));
//获取上周一
System.out.println("上周一:"+now.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)));
//获取下周日
System.out.println("下周日:"+now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
输出:
当月第一天:2021-06-01T14:48:02.099
下月第一天:2021-07-01T14:48:02.099
明年第一天:2022-01-01T14:48:02.099
本年第一天:2021-01-01T14:48:02.099
当月最后一天:2021-06-30T14:48:02.099
本年最后一天:2021-12-31T14:48:02.099
当月第三周星期五:2021-06-18T14:48:02.099
上周一:2021-06-07T14:48:02.099
下周日:2021-06-20T14:48:02.099