需求:
每个月可能跑批,要求给定开始时间和结束时间以及每月多少号进行跑批,在该时间段内找到符合条件的日期,如果是29,30,31这几天个别月份可能没有,可以赋值为当月最后一天。
代码实现
package com.qcj;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
*创建人:inspur.qichangjian
*/
public class test_cal {
public static void main(String[] args) throws Exception {
String minDate = "2016-12-31";//三月二日会变成
String maxDate = "2019-05-2";
List<String> test = getMonthBetween3(minDate,maxDate,30);
System.out.println(test);
}
public static List<String> getMonthBetween3(String minDate, String maxDate,int day) throws Exception {
int flag = day;//几号
ArrayList<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(sdf.parse(minDate));
max.setTime(sdf.parse(maxDate));
Calendar curr = min;
while (curr.before(max)) {// 当前Calendar对象 是否 晚于calendar
// System.out.println("标志:"+flag + "curr日期:" + sdf.format(curr.getTime()) +"|是否不相等" + (curr.get(Calendar.DATE) != flag));
if(curr.get(Calendar.DATE) != flag){//关键注释1:判断当前日期日是否和需要的日期是一天
System.out.println("进入if......");
//设置为这个月的最后一天
//getMaxMonthDate(sdf.format(curr.getTime()));
Calendar lastday = Calendar.getInstance();
lastday.setTime(sdf.parse(getMaxMonthDate(sdf.format(curr.getTime()))));//设置时间
curr = lastday;//关键注释二:将当前月的最后日期赋值给curr
if(curr.get(Calendar.DATE) > flag){//关键注释三:判断修改后的时间是否和需要时间相等,如果赋值的月底时间是31 需要的是30号就重新赋值
curr.set(curr.get(Calendar.YEAR),curr.get(Calendar.MONTH),flag);//关键注释四:修改最后时间为需要的时间
}
}
result.add(sdf.format(curr.getTime()));
curr.add(Calendar.MONTH, 1);//加一个月
}
return result;
}
/**
* 获取当前月份最后日期
* @param date
* @return
* @throws ParseException
*/
public static String getMaxMonthDate(String date) throws ParseException, java.text.ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月
Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return sdf.format(calendar.getTime());
}
}