/**
* 根据 年、月 获取对应的月份 的 天数
*
* @param year
* @param month
* @return
*/
public static int getDaysByYearMonth(int year, int month) {
Calendar a = Calendar.getInstance();
a.set(Calendar.YEAR, year);
a.set(Calendar.MONTH, month - 1);
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
public static List<String> normalSql(String starttime, String endtime) {
//存放日期号
ArrayList<String> timelist = new ArrayList<String>();
//对开始日期截取
String[] startsplit = starttime.split("-");
//对结束日期截取
String[] endsplit = endtime.split("-");
//如果起止时间是同一个月的情况
if (Integer.parseInt(endsplit[1]) - Integer.parseInt(startsplit[1]) == 0) {
int equalsday = Integer.parseInt(endsplit[2]) - Integer.parseInt(startsplit[2]);
for (int i = 0; i <= equalsday; i++) {
timelist.add(startsplit[0] + "_" + startsplit[1] + "_" + (String.valueOf(Integer.parseInt(startsplit[2]) + i).matches("(0)|(100)|([1-9])") ? "0" + String.valueOf(Integer.parseInt(startsplit[2]) + i) : String.valueOf(Integer.parseInt(startsplit[2]) + i)));
}
} else {
//
int startday = getDaysByYearMonth(Integer.parseInt(startsplit[0]), Integer.parseInt(startsplit[1]));
//得出那个月低距离开始时间有几天
int days = startday - Integer.parseInt(startsplit[2]);
for (int i = 0; i <= days; i++) {
timelist.add(startsplit[0] + "_" + startsplit[1] + "_" + (String.valueOf(Integer.parseInt(startsplit[2]) + i).matches("(0)|(100)|([1-9])") ? "0" + String.valueOf(Integer.parseInt(startsplit[2]) + i) : String.valueOf(Integer.parseInt(startsplit[2]) + i)));
}
if (Integer.parseInt(endsplit[0]) - Integer.parseInt(startsplit[0]) == 0) {
int months = Integer.parseInt(endsplit[1]) - Integer.parseInt(startsplit[1]);
for (int i = 0; i < months - 1; i++) {
int monthdayss = getDaysByYearMonth(Integer.parseInt(startsplit[0]), Integer.parseInt(startsplit[1]) + i + 1);
for (int j = 0; j < monthdayss; j++) {
timelist.add(startsplit[0] + "_" + (String.valueOf(Integer.parseInt(startsplit[1]) + i + 1).matches("(0)|(100)|([1-9])") ? "0" + String.valueOf(Integer.parseInt(startsplit[1]) + i + 1) : String.valueOf(Integer.parseInt(startsplit[1]) + i + 1)) + "_" + (j < 9 ? "0" + (j + 1) : j + 1));
}
}
}
//起止时间相隔一年以及一年以上
int years = Integer.parseInt(endsplit[0]) - Integer.parseInt(startsplit[0]);
if (years >= 1) {
//开始时间不完整年的日期到年末的日期拼接
int startmonth = Integer.parseInt(startsplit[1]);
for (int i = 0; i < 12 - startmonth; i++) {
int startyearmonthday = getDaysByYearMonth(Integer.parseInt(startsplit[0]), Integer.parseInt(startsplit[1]) + 1 + i);
for (int j = 0; j < startyearmonthday; j++) {
timelist.add(startsplit[0] + "_" + (String.valueOf(Integer.parseInt(startsplit[1]) + i + 1).matches("(0)|(100)|([1-9])") ? "0" + String.valueOf(Integer.parseInt(startsplit[1]) + i + 1) : String.valueOf(Integer.parseInt(startsplit[1]) + i + 1)) + "_" + (j < 9 ? "0" + (j + 1) : j + 1));
}
}
//拼接完整的年日期
for (int i = 1; i < years; i++) {
for (int j = 0; j < 12; j++) {
//得到中间一整年的每月多少天
int modyearday = getDaysByYearMonth(Integer.parseInt(startsplit[0]) + 1, j + 1);
for (int k = 0; k < modyearday; k++) {
timelist.add((Integer.parseInt(startsplit[0]) + i) + "_" + (((j + 1) <= 9) ? "0" + (j + 1) : j + 1) + "_" + (((k + 1) <= 9) ? "0" + (k + 1) : k + 1));
}
}
}
//结束日期中不完整的年份到该年的起始日期拼接
int endmonth = Integer.parseInt(endsplit[1]);
for (int i = 0; i < endmonth - 1; i++) {
int endyearmonthday = getDaysByYearMonth(Integer.parseInt(endsplit[0]), i + 1);
for (int j = 0; j < endyearmonthday; j++) {
timelist.add(endsplit[0] + "_" + (((i + 1) < 9) ? "0" + (i + 1) : i + 1) + "_" + (j < 9 ? "0" + (j + 1) : j + 1));
}
}
}
//对用户输入的结束日期进行截取
//得到用户输入的结束日期的那月有多少天
for (int i = 0; i < Integer.parseInt(endsplit[2]); i++) {
timelist.add(endsplit[0] + "_" + endsplit[1] + "_" + (i < 9 ? "0" + (i + 1) : i + 1));
}
}
return timelist;
}
测试
@Test
public void test2() {
List<String> list = normalSql("2019-01-01", "2019-05-01");
for(String s:list){
System.out.println(s);
}
}
结果