java8 自定义TemporalAdjuster

        有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,你可以使用重载版本的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创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
 期几要求的日期,如果该日期已经符合要求,直接返回该对象

下面看下例子:
	@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);
	}
	
}


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值