时间工具之“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

posted @ 2023-02-02 09:55  骚哥  阅读(2212)  评论(0编辑  收藏  举报