时间调节器TemporalAdjuster

421 阅读3分钟

TemporalAdjusters工具类有很多预定义的static方法返回TemporalAdjuster对象,使用不同方式调节Temporal对象而与Temporal实现无关。

TemporalAdjuster的常用方法

    • 修饰符和返回值方法名以及描述
      static TemporalAdjusterdayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)某月的第几个星期几,例如,三月中第二个星期二。
      static TemporalAdjusterfirstDayOfMonth()某月的第几个星期几,例如,三月中第二个星期二。
      static TemporalAdjusterfirstDayOfNextMonth()下一个月的第一天。
      static TemporalAdjusterfirstDayOfNextYear()返回“明年的第一天”调整器。
      static TemporalAdjusterfirstDayOfYear()返回“当年的第一天”调整器。
      static TemporalAdjusterfirstInMonth(DayOfWeek dayOfWeek)返回“某月的第一个星期几”调整器。
      static TemporalAdjusterlastDayOfMonth()返回“当前月份的最后一天”调整器。
      static TemporalAdjusterlastDayOfYear()返回“当前年份的最后一天”调整器。
      static TemporalAdjusterlastInMonth(DayOfWeek dayOfWeek)返回“某月的最后一个星期几”的调整器。
      static TemporalAdjusternext(DayOfWeek dayOfWeek)(往后不包括当天)下一个星期几是几月几号。若当前为周三,那么next(DayOfWeek.WEDNESDAY)指下一个周三即下周三;next(DayOfWeek.SUNDAY) 指下一个周日即本周日(此时并不是下周日)。
      static TemporalAdjusternextOrSame(DayOfWeek dayOfWeek)(往后包括当天)最近星期几的日期。如最近星期五的日期,如果今天是星期五,则返回今天日期,如果今天不是星期五,则返回下周五的日期。
      static TemporalAdjusterofDateAdjuster(UnaryOperator<LocalDate> dateBasedAdjuster)自定义日期调整器的 TemporalAdjuster
      static TemporalAdjusterprevious(DayOfWeek dayOfWeek)(往前不包括当天)上一个星期几是几月几号。若当前为周三,那么previous(DayOfWeek.WEDNESDAY)指上一个周三即上周三;previous(DayOfWeek.TUESDAY) 指上一个周二即昨天(此时并不是上周二)。
      static TemporalAdjusterpreviousOrSame(DayOfWeek dayOfWeek)(往前包括当天)最近星期几的日期。如最近星期五的日期,如果今天是星期五,则返回今天日期,如果今天不是星期五,则返回上周五的日期。

案例:

LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间:" + now + "======>" + now.getDayOfWeek());
System.out.println("下一个周一:" + now.with(TemporalAdjusters.next(DayOfWeek.MONDAY)));
System.out.println("上一个周一:" + now.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)));
System.out.println("下一个周五:" + now.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY)));
System.out.println("上一个周五:" + now.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY)));
System.out.println("本月最后一个周五:" + now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)));
System.out.println("本月第一个周五:" + now.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY)));
System.out.println("本月第一天:" + now.with(TemporalAdjusters.firstDayOfMonth()));
System.out.println("本月最后一天:" + now.with(TemporalAdjusters.lastDayOfMonth()));
System.out.println("下月的第一天:" + now.with(TemporalAdjusters.firstDayOfNextMonth()));
System.out.println("今年的第一天:" + now.with(TemporalAdjusters.firstDayOfYear()));
System.out.println("今年的最后一天:" + now.with(TemporalAdjusters.lastDayOfYear()));
System.out.println("下一年的第一天:" + now.with(TemporalAdjusters.firstDayOfNextYear()));
System.out.println("本月的第二个周五:" + now.with(TemporalAdjusters.dayOfWeekInMonth(2,DayOfWeek.FRIDAY)));
System.out.println("两周后:" + now.with(TemporalAdjusters.ofDateAdjuster(date -> date.plusWeeks(2))));
/*打印结果:
当前时间:2020-04-03T11:32:59.871======>FRIDAY
下一个周一:2020-04-06T11:32:59.871
上一个周一:2020-03-30T11:32:59.871
下一个周五:2020-04-03T11:32:59.871
上一个周五:2020-04-03T11:32:59.871
本月最后一个周五:2020-04-24T11:32:59.871
本月第一个周五:2020-04-03T11:32:59.871
本月第一天:2020-04-01T11:32:59.871
本月最后一天:2020-04-30T11:32:59.871
下月的第一天:2020-05-01T11:32:59.871
今年的第一天:2020-01-01T11:32:59.871
今年的最后一天:2020-12-31T11:32:59.871
下一年的第一天:2021-01-01T11:32:59.871
本月的第二个周五:2020-04-10T11:32:59.871
两周后:2020-04-17T11:32:59.871
*/