背景:
最近中的需求有这么一个要求给一个会计期间 就是一个时间范围 返回每个月最后一天,最后一个月取期间中的最后日期
数据例子:
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;
}
系统中存在多种时间的会使用到以上方法