方法一:
依赖: <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency> Date startTime = new SimpleDateFormat("yyyy-MM").parse("2018-11");// 起始日期 Date endTime = new SimpleDateFormat("yyyy-MM").parse("2019-01");// 结束日期 if (startTime.after(endTime)) { throw new WebRuntimeException("摊销开始时间大于摊销结束时间!"); } Calendar startCalendar = Calendar.getInstance();// 定义日期实例 startCalendar.setTime(startTime);// 设置日期起始时间 Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endTime); DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM"); DateTime start = formatter.parseDateTime("2018-11"); DateTime end = formatter.parseDateTime("2019-01"); int months = Math.abs(Months.monthsBetween(start, end).getMonths())+1; logger.info(months+"期"); for (; startCalendar.getTime().compareTo(endCalendar.getTime()) <= 0;) { //dayc1在dayc2之前就循环 logger.info(startCalendar.get(Calendar.MONTH)+1+"月"); startCalendar.add(Calendar.MONTH, 1); }
方法二:
try {
Date startTime = new SimpleDateFormat("yyyy-MM").parse(vo.getStartTime());// 起始日期
Date endTime = new SimpleDateFormat("yyyy-MM").parse(vo.getEndTime());// 结束日期
if(startTime.after(endTime)){
throw new WebRuntimeException("预提开始时间大于预提结束时间);
}
Calendar startCalendar = Calendar.getInstance();// 定义日期实例
startCalendar.setTime(startTime);// 设置日期起始时间
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endTime);
Calendar AccruedCalendar = Calendar.getInstance();
AccruedCalendar.setTime(startTime);
List accruedPeriodList = new ArrayList();
BigDecimal sum = new BigDecimal("0");
while (!(AccruedCalendar.get(Calendar.MONTH) == endCalendar.get(Calendar.MONTH) && AccruedCalendar.get(Calendar.YEAR) == endCalendar.get(Calendar.YEAR))) {
//保存一个预提期间
//1-12月用Calendar直接获取的结果是0-11
AccruedPeriodVO periodVO = new AccruedPeriodVO();
periodVO.setTenantId(vo.getTenantId());
periodVO.setContractCode(vo.getContractCode());
int month = AccruedCalendar.get(Calendar.MONTH) + 1;
periodVO.setAccruedPeriod(String.valueOf(AccruedCalendar.get(Calendar.YEAR)) + "-" + (month < 10 ? "0" + month : month));
accruedPeriodList.add(periodVO);
/* if(AccruedCalendar.get(Calendar.MONTH)==11){
AccruedCalendar.add(Calendar.YEAR, 1);
}*/
//下一预提期间加一个月
AccruedCalendar.add(Calendar.MONTH, 1);
}
AccruedPeriodVO periodVO = new AccruedPeriodVO();
periodVO.setContractCode(vo.getContractCode());
int month = AccruedCalendar.get(Calendar.MONTH) + 1;
periodVO.setAccruedPeriod(String.valueOf(AccruedCalendar.get(Calendar.YEAR)) + "-" + (month < 10 ? "0" + month : month));
accruedPeriodList.add(periodVO);
accruedPeriodVOService.batchInsert(accruedPeriodList);
logger.info("预提期间批量保存结束,开始修改主表状态");
} catch (ParseException e) {
e.printStackTrace();
throw new WebRuntimeException(e);
}
比如起始时间是,2018-01,2018-12,那么生成的预提期间是如下图
如果有更好的思路欢迎探讨