如何根据传入时间,获取附近7条日期并且不可超出当前时间

 @Test
    public void List() {
        String appointTime = "2021-12-02";
        List<String> dateList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        String now = simpleDateFormat.format(date);
        try {
            date = simpleDateFormat.parse(appointTime);
            log.info("转换成功 {}", date);
        } catch (ParseException e) {
            log.info("转换失败 {}", date);
        }
        //先获取后三天
        String insertTime;
        for (int i = 0; i <= 3; i++) {
            insertTime = simpleDateFormat.format(DateUtils.addDays(date, i));
            dateList.add(insertTime);
            if (insertTime.equals(now)) {
                break;
            }

        }
        Integer num = dateList.size();
        //根据指定天数后获取数,判断指定时间前需获取多少条
        for (int i = 1; i <= 7 - num; i++) {
            insertTime = simpleDateFormat.format(DateUtils.addDays(date, -i));
            dateList.add(insertTime);
        }
        Collections.sort(dateList);
    }

目前能力只能通过代码堆积的形式实现,请问还有什么更好的方法来获取实现吗,学生我技术上限了。求各位老师指点指点

回复
阅读 1.6k
2 个回答

开始回答了一版,发现理解错了意思。。哈哈哈,删了重新回答一次

我试了几个appointTime的值,感觉本质来说,主要是以appointTime时间为基准,一半范围(这里是3天),找到一个最靠近当前时间的日期,超过就以当前日期为最靠近日期,然后从这个日期往前找7天即可

所以把上面的逻辑翻译成代码,借用LocalDateStream.iterate就能构建题主想要的答案

public static List<LocalDate> findWithScope(String appointTime, long scope) {
    long half = scope / 2;
    LocalDate appointDatetime = LocalDate.parse(appointTime);
    LocalDate now = LocalDate.now();
    
    // 超过一半范围的日期
    LocalDate afterHalfDate = appointDatetime.plusDays(half);
    LocalDate initDate = afterHalfDate;
    // 如果一半范围的日期超过当前时间,则初始日期以当前时间为准
    if (afterHalfDate.isAfter(now)) {
         initDate = now;
    }
    
    // Stream.iterate的方法签名就是以第一个参数为基准,用第二个参数的方法生成下一个元素,依此类推
    List<LocalDate> dates = Stream.iterate(initDate, localDate -> localDate.minusDays(1l))
                                  .limit(scope)
                                  .collect(Collectors.toList());
    return dates;
}

取传入的前三天+传入时间+传入的后三天

循环判断时间是否大于当前时间,大于的话就-7天
最后再排下序

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏