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;
}
系统中存在多种时间的会使用到以上方法