有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,你可以使用重载版本的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创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
期几要求的日期,如果该日期已经符合要求,直接返回该对象
dayOfWeekInMonth 创建一个新的日期,它的值为同一个月中每一周的第几天
firstDayOfMonth 创建一个新的日期,它的值为当月的第一天
firstDayOfNextMonth 创建一个新的日期,它的值为下月的第一天
firstDayOfNextYear 创建一个新的日期,它的值为明年的第一天
firstDayOfYear 创建一个新的日期,它的值为当年的第一天
firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值
lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天
lastDayOfNextMonth 创建一个新的日期,它的值为下月的最后一天
lastDayOfNextYear 创建一个新的日期,它的值为明年的最后一天
lastDayOfYear 创建一个新的日期,它的值为今年的最后一天
lastInMonth 创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值
next/previous
创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期
nextOrSame/previousOrSame创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
期几要求的日期,如果该日期已经符合要求,直接返回该对象
下面看下例子:
@Test
public 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-18
System.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
}
// 自定义 求解下个工作日时间
@Test
public 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));
//方式3
LocalDate date3 = date.with(new NextWorkingDay());
System.out.println("下个工作日为:"+date3);
}
//如果要复用自定义的TemporalAdjuster,可以自已定义类
class NextWorkingDay implements TemporalAdjuster{
@Override
public Temporal adjustInto(Temporal temporal) {
//方式1
// LocalDate date=(LocalDate)temporal;
//方式2
int 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);
}
}