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创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
期几要求的日期,如果该日期已经符合要求,直接返回该对象
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);}}
阅读全文
1 0
- java8 自定义TemporalAdjuster
- Java8自定义函数
- java8 自定义Collector
- java8 自定义收集器Collector
- JAVA8自定义Lambda表达式的常见使用方法
- Java8自定义带泛型的函数式接口
- Java8
- java8
- Java8
- java8
- java8
- java8
- java8
- Java8
- Java8
- Java8
- java8
- java8
- kafka->spark->streaming->mysql(scala)实时数据处理示例
- JAVA程序员必看的15本书
- jdk1.8 HashMap源码分析(put函数)
- MapReduce编程模型及优化技巧
- Python之操作XML文件
- java8 自定义TemporalAdjuster
- Window下 Qt 编译MySQL驱动
- 链表各类操作详解(讲得非常详细)
- ALTER TABLE ADD 增加多个字段 外键约束
- 数据库事务
- jdk1.8 HashMap源码分析(构造函数)
- js设计模式之构造函数
- POJ
- AWS sns推送消息 sqs获取消息实现Demo