将一段时间按照月划分
业务场景:数据按月分表存储,数据跨月或者跨年查询时需要从不同的表中获取数据。
解决思路:
1. 是否跨年了,跨了几年。
2. 是否跨月了,跨了几个月。
3. 每个月开始时间和结束时间。
4. 组装成时间查询数组。
5. 循环数组、查询拼接。
主要代码:
/**
* 以月为单位拆分时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return 时间参数集合
*/
public static List<TimeParam> splitByMonth(String startTime, String endTime) {
List<TimeParam> list = new ArrayList<>(8);
try {
String[] startArr = startTime.split("-");
String[] endArr = endTime.split("-");
if (startArr[0].equals(endArr[0])) {
// 同一年
if (startArr[1].equals(endArr[1])) {
// 同一个月
TimeParam param = new TimeParam(startTime, endTime);
list.add(param);
} else {
int year = Integer.parseInt(startArr[0]);
// 跨月
int start = Integer.parseInt(startArr[1]);
int end = Integer.parseInt(endArr[1]);
for (int i = start; i <= end; i++) {
// 每个月的天数
int num = getDayOfMonth(year, i);
// 月份格式化
String month = String.format("%02d", i);
if (i == start) {
list.add(new TimeParam(startTime, year + "-" + month + "-" + num));
} else if (i == end) {
list.add(new TimeParam(year + "-" + month + "-01", endTime));
} else {
list.add(new TimeParam(year + "-" + month + "-01", year + "-" + month + "-" +num));
}
}
}
} else {
// 跨年
int start = Integer.parseInt(startArr[0]);
int end = Integer.parseInt(endArr[0]);
for (int i = start; i <= end; i++) {
if(i == start) {
list.addAll(splitByMonth(startTime, i + "-12-31"));
} else if (i == end) {
list.addAll(splitByMonth(i + "-01-01", endTime));
} else {
list.addAll(splitByMonth(i + "-01-01", i + "-12-31"));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 获取某年某月有多少天
* @param year 年
* @param month 月
* @return 天数
*/
public static int getDayOfMonth(int year,int month){
Calendar c = Calendar.getInstance();
c.set(year, month, 0);
return c.get(Calendar.DAY_OF_MONTH);
}
/**
* 月份格式化
* @param num 月份
* @return 格式化后的月份
*/
public static String format (int num) {
if (num < 10) {
return "0" + num;
}
return "" + num;
}
public class TimeParam {
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
public TimeParam() {}
public TimeParam(String startTime, String endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
public static void main(String[] args) {
// 开始时间
String startTime = "2018-07-23";
// 结束时间
String endTime = "2020-07-21";
List<TimeParam> list = TimeUtil.splitByMonth(startTime, endTime);
list.forEach(t -> System.out.println(t.getStartTime() +" ---------------------- "+ t.getEndTime()));
}
以上是 将一段时间按照月划分 的全部内容, 来源链接: utcz.com/z/518541.html