java8 自定义TemporalAdjuster

来源:互联网 发布:熟悉掌握办公软件 编辑:程序博客网 时间:2024/06/07 23:17

        有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,你可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象,更 加 灵 活 地 处 理 日 期 

        看下接口定义,就一个方法

@FunctionalInterface
public interface TemporalAdjuster {

        Temporal adjustInto(Temporal temporal);
}
这里一些常用的操作在TemporalAdjusters类已经预定义了
 TemporalAdjusters的一些预定义方法
 dayOfWeekInMonth 创建一个新的日期,它的值为同一个月中每一周的第几天
 firstDayOfMonth 创建一个新的日期,它的值为当月的第一天
 firstDayOfNextMonth 创建一个新的日期,它的值为下月的第一天
 firstDayOfNextYear 创建一个新的日期,它的值为明年的第一天
 firstDayOfYear 创建一个新的日期,它的值为当年的第一天
 firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值
 lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天
 lastDayOfNextMonth 创建一个新的日期,它的值为下月的最后一天
 lastDayOfNextYear 创建一个新的日期,它的值为明年的最后一天
 lastDayOfYear 创建一个新的日期,它的值为今年的最后一天
 lastInMonth 创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值
 next/previous
 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期
 nextOrSame/previousOrSame创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
 期几要求的日期,如果该日期已经符合要求,直接返回该对象

下面看下例子:
@Testpublic void testName() {LocalDate date = LocalDate.parse("2017-08-15");//获取这个月的第一个周末的时间System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));//2017-08-06//获取上个月的最后一周System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(0, DayOfWeek.SUNDAY)));//2017-07-30//获取这个月的倒数第一个周末的时间System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(-1, DayOfWeek.SUNDAY)));//2017-08-27//获取这个月的第一个周末的时间,上面的dayOfWeekInMonth更灵活,可以定义第几周System.out.println(date.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY)));//2017-08-06//其底层调用的是//  return TemporalAdjusters.dayOfWeekInMonth(1, dayOfWeek);//明年的第一天System.out.println(date.with(TemporalAdjusters.firstDayOfNextYear()));//2018-01-01//获取下周5的时间System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));//2017-08-18System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)));//2017-08-22,始终返回下周的某个时间//获取周2时间System.out.println(date.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)));//2017-08-15,如果当前时间刚好是星期三,那么就返回当前时间// 获取本月最后一天System.out.println(date.with(TemporalAdjusters.lastDayOfMonth()));//2017-08-31}


自定义 调整器
// 自定义   求解下个工作日时间@Testpublic void testName2() {LocalDate date = LocalDate.now();// 自定义,获取下个工作日// 方式1 LocalDate date2 = date.with(d -> {LocalDate t = (LocalDate) d;DayOfWeek dow = t.getDayOfWeek();if (dow.equals(DayOfWeek.FRIDAY)) {return t.plusDays(3);} else if (dow.equals(DayOfWeek.SATURDAY)) {return t.plusDays(2);} else {return t.plusDays(1);}});System.out.println("下个工作日为:" + date2);//方式2  推荐  参数默认localdate//如果是localTime呢,用其他方式吧TemporalAdjuster next = TemporalAdjusters.ofDateAdjuster(tdate->{DayOfWeek work = tdate.getDayOfWeek();int addDays=0;if (work.equals(DayOfWeek.FRIDAY)) {addDays=3;}else if(work.equals(DayOfWeek.SATURDAY)){addDays=2;}else {addDays=1;}return date.plusDays(addDays);});System.out.println("下个工作日为:"+date.with(next));//方式3LocalDate date3 = date.with(new NextWorkingDay());System.out.println("下个工作日为:"+date3);}



//如果要复用自定义的TemporalAdjuster,可以自已定义类class NextWorkingDay implements TemporalAdjuster{@Overridepublic Temporal adjustInto(Temporal temporal) {//方式1//LocalDate date=(LocalDate)temporal;//方式2int addDays=0;DayOfWeek work = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));if (work.equals(DayOfWeek.FRIDAY)) {addDays=3;}else if(work.equals(DayOfWeek.SATURDAY)){addDays=2;}else {addDays=1;}return temporal.plus(addDays, ChronoUnit.DAYS);}}


原创粉丝点击