LocalDateTime日期类进阶使用及DayOfWeek 星期枚举

概要

几天遇到一个需求要求给入指定枚举周获取至下一枚举周的日期

参数:1.一个指定周几的list

        2.自己通过当日日期计算出下一个周数(该块代码未贴至本贴)

例:指定list为[1,3,5],当日周三则计算出的周数为5

技术细节

最开始使用TemporalAdjusters.nextOrSame(dayOfWeek)结果一直不对当日枚举日的每一次轮循下日期都不对,最终发现使用TemporalAdjusters.next(dayOfWeek)完美解决问题

TemporalAdjusters.nextOrSame(dayOfWeek) 方法是返回下一个指定星期几的日期,如果当前日期恰好就是该星期几,则返回当天的日期。

TemporalAdjusters.next(dayOfWeek) 方法则是直接返回下一个指定星期几的日期,不论当前日期是否为该星期几。

例如,假设今天是周三,调用 TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY) 返回的是今天的日期(即9月13日),而调用 TemporalAdjusters.next(DayOfWeek.WEDNESDAY) 返回的是下周三的日期(即9月20日)。

如下代码会返回十次指定周数的日期,例:今天的日期(即9月13日)则dayList集合里面第一条会是周五9月十五日,接着依次周一、周三、周五直至dayList中塞满10条

    public static void main(String[] args) {
        ArrayList<Date> dayList = new ArrayList<>();
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
// 指定下个为周5
        int dayWeek=1;
        int index = list.indexOf(dayWeek);
        if (index==0){
            index=1;
        }
        List<Integer> subTwo=list;//若为设定的第一天则不进行排序
        if (dayWeek!=list.get(0)){
            // 进行排序
            List<Integer> subOne = new ArrayList<>(list.subList(0, index));//创建新的列表对象,确保对 subOne 的修改不会影响原始列表
            subTwo = new ArrayList<>(list.subList(index, list.size()));//创建新的列表对象,确保对 subTwo 的修改不会影响原始列表
            subTwo.addAll(subOne);
        }
        System.out.println("排序后的集合--"+list);

        // 将列表转换为 Integer 数组
        Integer[] integerArray = subTwo.toArray(new Integer[0]);
        // 创建 DayOfWeek 数组
        DayOfWeek[] targetDays = new DayOfWeek[integerArray.length];

        // 将 Integer 数组中的元素转换为 DayOfWeek 枚举类型
        for (int i = 0; i < integerArray.length; i++) {
            targetDays[i] = DayOfWeek.of(integerArray[i]);

        }
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        LocalTime currentTime = LocalTime.now();

        int count = 0;
        while (count < 10) {
//            每轮循完数组一次对当日日期LocalDate加一周。例:第一次轮循currentDate为9月10日,第二次就为9月17日
            for (DayOfWeek dayOfWeek : targetDays) {
                LocalDateTime nextDateTime = currentDate.atTime(currentTime).with(TemporalAdjusters.next(dayOfWeek));//将当天日期和时间合并
                //将LocalDateTime转换成date日期类
                Date date = Date.from(nextDateTime.atZone(ZoneId.systemDefault()).toInstant());
//                将时分秒设成指定00:00:00
                Date date1 = resetTime(date);
                dayList.add(date1);
                count++;
                if (count >= 10) {
                    break;
                }
            }

//            将 currentDate 的值增加一周
            currentDate = currentDate.plusWeeks(1);
        }
        for (int i = 0; i < dayList.size(); i++) {
            System.out.println("返回结果:"+dayList.get(i));
        }

    }

小结

提示:这里可以添加总结

例如:

提供先进的推理,复杂的指令,更多的创造力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值