• Java 获取一个时间范围内的最后一天或者第一天


    Java 获取一个时间范围内的最后一天或者第一天

    背景:

    最近中的需求有这么一个要求给一个会计期间 就是一个时间范围 返回每个月最后一天,最后一个月取期间中的最后日期

    数据例子:

    2022-01-01 - 2022-12-13

    那么要生成下列数据:

    1.2022-01-31 2.2022-02-28

    3.2022-03-31 4.2022-04-30

    5.2022-05-31 6.2022-06-30

    7.2022-07-31 8.2022-08-31

    9.2022-09-30 10.2022-10-31

    11.2022-11-30 12.2022-12-13

    // 创建一个时间 可以是Date 或者是 LocalDate
    LocalDate start = new LocalDate();
    LocalDate end = new LocalDate();
    // LocalDate 转 string
    String startStr = start.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    String endStr = end.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    
    List<String> monthBetweenDateList = getMonthBetweenDate(startStr, endStr);
    if (CollectionUtils.isEmpty(monthBetweenDateList)) {
        return Result.error("没有时间范围");
    }
    int size = monthBetweenDateList.size();
    for (int i = 0; i < monthBetweenDateList.size(); i++) {
        if (i == size - 1) {
            monthBetweenDateList.set(i, endStr);
        } else {
            monthBetweenDateList.set(i, LocalDate.parse(monthBetweenDateList.get(i))
                                     .with(TemporalAdjusters.lastDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        }
    }
    log.error("查询出时间集合" + JSONObject.toJSONString(monthBetweenDateList));
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    getMonthBetweenDate方法:

        /**
         * 获取两个日期之间的所有月份 (年月)
         *
         * @param startTime
         * @param endTime
         * @return:YYYY-MM
         */
        public static List<String> getMonthBetweenDate(String startTime, String endTime){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            // 声明保存日期集合
            List<String> list = new ArrayList<String>();
            try {
                // 转化成日期类型
                Date startDate = sdf.parse(startTime);
                Date endDate = sdf.parse(endTime);
    
                //用Calendar 进行日期比较判断
                Calendar calendar = Calendar.getInstance();
                while (startDate.getTime()<=endDate.getTime()){
                    // 把日期添加到集合
                    list.add(sdf.format(startDate));
                    // 设置日期
                    calendar.setTime(startDate);
                    //把日期增加一月
                    calendar.add(Calendar.MONTH, 1);
    
                    // 获取增加后的日期
                    startDate=calendar.getTime();
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return list;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    开发中会使用到:

    LocalDate 和 Date 和 String互换方法:

    String->LocalDate

    LocalDate.parse(fields, DateTimeFormatter.ofPattern("yyyy-MM-dd"))
    
    • 1

    localDate->Date

    private static Date getLocalDateToDate(LocalDate data) {
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = data.atStartOfDay(zoneId);
        Date date = Date.from(zdt.toInstant());
        return date;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Date->localDate

    private static LocalDate getDateToLocalDate(Date data) {
        Instant instant = data.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        return localDate;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    系统中存在多种时间的会使用到以上方法

  • 相关阅读:
    ARM 汇编伪指令
    ...args: any[] TypeScript 中的剩余参数语法
    Linux系统 Nginx服务器集群配置
    Lucene从入门到实战
    【gock】 无侵入的 Http Mock 工具
    八大元素定位方法(Python/Java)
    pytest生成HTML测试报告
    img为空时不显示
    PX4模块设计之三十九:Commander模块
    Node.js学习-12nodejs简介
  • 原文地址:https://blog.csdn.net/weng74/article/details/133342004