时间工具之“Java8 LocalDate 根据给定的日期,获取该日期上一周的周一周日,以及TemporalAdjusters的API”
一、场景
我们的周报需要获取该月的第一个周的星期一和星期日,用于计算该星期的功能业绩(如:上产品数量)
2022-04-25 00:00:00 到 2022-05-01 23:59:59
2022-05-02 00:00:00 到 2022-05-08 23:59:59
2022-05-09 00:00:00 到 2022-05-15 23:59:59
2022-05-16 00:00:00 到 2022-05-22 23:59:59
2022-05-23 00:00:00 到 2022-05-29 23:59:59
二、代码
@Test public void test() { // LocalDate格式的:2022-04-25 LocalDate with2 = LocalDateTimeUtil.parseDate("2022-05", "yyyy-MM").with(TemporalAdjusters.firstDayOfMonth()) .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); System.out.println("with2 = " + with2); // 将LocalDateTime格式转为String的yyyy-MM-dd格式 :2022-04-25T00:00 转为 2022-04-25 // previousOrSame (往前包括当天)最近星期几的日期。如最近星期五的日期,如果今天是星期五,则返回今天日期,如果今天不是星期五,则返回上周五的日期 // DayOfWeek.MONDAY 星期一 String format = LocalDateTimeUtil.parseDate("2022-05", "yyyy-MM").with(TemporalAdjusters.firstDayOfMonth()) .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); System.out.println("format = " + format); // 将LocalDateTime格式转为String的yyyy-MM-dd格式 :2022-05-29T23:59:59.999999999 转为 2022-05-29 // lastInMonth某月的最后一个星期几 // DayOfWeek.SUNDAY 星期天 String format1 = LocalDateTimeUtil.parseDate("2022-05", "yyyy-MM") .with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY)) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); System.out.println("format1 = " + format1); // 获取当前周的星期天日期 2022-05-01T23:59:59.999999999 // nextOrSame (往前包括当天)最近星期几的日期。如最近星期五的日期,如果今天是星期五,则返回今天日期,如果今天不是星期五,则返回上周五的日期 LocalDateTime withQuery7 = LocalDate.of(2022, 5, 1).atTime(LocalTime.MAX).with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); System.out.println("with = " + withQuery7); // 获取当前周的星期一日期 2022-04-25T00:00 LocalDateTime withQuery1 = LocalDate.of(2022, 5, 1).atTime(LocalTime.MIN).with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); System.out.println("with = " + withQuery1); // 获取下一个星期天 2022-05-08T23:59:59.999999999 LocalDateTime localDateTime7 = withQuery7.plusWeeks(1); System.out.println("localDateTime7 = " + localDateTime7); // 获取下一个星期一 2022-05-02T00:00 LocalDateTime localDateTime1 = withQuery1.plusWeeks(1); System.out.println("localDateTime1 = " + localDateTime1); // 获取第五周星期天的月份 6 LocalDateTime localDateTime5Week = localDateTime7.plusWeeks(5); System.out.println("localDateTime5Week = " + localDateTime5Week); int monthValue = localDateTime5Week.getMonthValue(); System.out.println("monthValue = " + monthValue); // 获取当月最后一个星期天 2022-05-29T23:59:59.999999999 LocalDateTime with = LocalDate.of(2022, 5, 1).atTime(LocalTime.MAX) .with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY)); System.out.println("with = " + with); // 获取当月第一个星期一 2022-05-02T00:00 LocalDateTime with1 = LocalDate.of(2022, 5, 1).atTime(LocalTime.MIN) .with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); System.out.println("with1 = " + with1); }
三、结果图
四、技术解析
①TemporalAdjusters类中预定义实现
TemporalAdjusters工具类有很多预定义的static方法返回TemporalAdjuster对象,使用不同方式调节Temporal对象而与Temporal实现无关。
包括当前:就是当前时间是星期天,2022.5.1号,就是我们需要的数据,就会返回,如果不包含的话,就会到下一个星期中,就不会是当前周内的数据了
// 获取当前周的星期天日期 2022-05-01T23:59:59.999999999 // nextOrSame (包括当天) LocalDateTime withQuery7 = LocalDate.of(2022, 5, 1).atTime(LocalTime.MAX).with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); System.out.println("with = " + withQuery7); // 获取当前周的星期天日期 with = 2022-05-08T23:59:59.999999999 // next (不包括当天) LocalDateTime withQuery2 = LocalDate.of(2022, 5, 1).atTime(LocalTime.MAX).with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); System.out.println("with = " + withQuery2);
可以参考资料
https://blog.csdn.net/weixin_49114503/article/details/121676567
* 博客文章部分截图及内容来自于学习的书本及相应培训课程,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。
* 备注:王子威
* 我的网易邮箱:wzw_1314_520@163.com