将一段时间按照月划分

编程

业务场景:数据按月分表存储,数据跨月或者跨年查询时需要从不同的表中获取数据。

解决思路:
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

回到顶部