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));

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;
    }

开发中会使用到:

LocalDate 和 Date 和 String互换方法:

String->LocalDate

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

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;
}

Date->localDate

private static LocalDate getDateToLocalDate(Date data) {
    Instant instant = data.toInstant();
    ZoneId zoneId = ZoneId.systemDefault();
    LocalDate localDate = instant.atZone(zoneId).toLocalDate();
    return localDate;
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值