业务需求:后台管理系统中,计费账单模块,用户的消费实时产生费用记录,每条费用需要需要根据账单的周期,标记一个账单归属月份(如:202306,表示为6月份的消费记录),当前账单周期结束后,系统扫描标记为上个周期的消费记录,对记录进行汇总,得出用户上个账单周期的账单.
业务难点:①出现账单起始日期不为每月的1号情况;②出现账单周期不为一个月的情况,即大余1个月.
以下提供一个工具方法,第一个参数账单起始年月日,格式如:2023-01-01,第二个参数账单周期月数,方法自动返回一个账单年月标识,如:202301,即表示2023年1月份账单.另外出现跨月情况,账单年月的月份以最后一个月所在月命名,如:账单周期2023-02-01至2023-03-31,账单标记为202303.
package wsd.wsdzncloud.easycharge.autils;
import java.time.LocalDate;
import java.util.Calendar;
/**
* @Description: 生成账单年月
* @Author: MeiCheng 2023/7/20 22:20
*/
public class BuildMonth {
public static final String buildMonth(String startDate, int monthNum) {
// 获取当前年月日
Calendar date = Calendar.getInstance();
LocalDate now = LocalDate.of(
date.get(Calendar.YEAR),
date.get(Calendar.MONTH) + 1,
date.get(Calendar.DATE)
);
LocalDate start = LocalDate.of(
Integer.parseInt(startDate.split("-")[0]),
Integer.parseInt(startDate.split("-")[1]),
Integer.parseInt(startDate.split("-")[2])
);
LocalDate end = start.plusMonths(monthNum).minusDays(1);
// 账单月数
int num = monthNum;
while (now.isAfter(end)) {
monthNum = monthNum + num;
end = start.plusMonths(monthNum).minusDays(1);
}
String flag = end.getMonth().getValue() < 10 ? "0" : "";
return end.getYear() + flag + end.getMonth().getValue();
}
public static void main(String[] args) {
String buildMonth = buildMonth("2021-05-22", 1);
System.out.println("buildMonth: " + buildMonth);
}
}