1 按日切割时间段
private List<DateRangeEntity> splitDateByDay(String startDateStr,String endDateStr,int frequency) throws ParseException {
Date startDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,startDateStr);
Date endDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,endDateStr);
Calendar caleEnd = Calendar.getInstance();
caleEnd.setTime(endDate);
Calendar caleMid = Calendar.getInstance();
caleMid.setTime(startDate);
List<DateRangeEntity> dreList = new ArrayList<DateRangeEntity>();
int sequ = 1;
while (caleMid.before(caleEnd) || caleMid.equals(caleEnd)) {
DateRangeEntity dre = new DateRangeEntity();
Date midStartDate = caleMid.getTime();
caleMid.add(Calendar.DATE,frequency - 1);
dre.setStartDate(midStartDate);
dre.setEndDate(endDate.compareTo(caleMid.getTime()) <= 0 ? endDate : caleMid.getTime());
dre.setSequence(sequ);
dreList.add(dre);
sequ ++;
caleMid.add(Calendar.DATE,1);
}
return dreList;
}
2 按自然周切割时间段
private List<DateRangeEntity> splitDateByWeek(String startDateStr,String endDateStr,int frequency) throws ParseException {
Date startDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,startDateStr);
Date endDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,endDateStr);
List<DateRangeEntity> dreList = new ArrayList<DateRangeEntity>();
Calendar caleEnd = Calendar.getInstance();
caleEnd.setTime(endDate);
Calendar caleMidMin = Calendar.getInstance();
caleMidMin.setTime(startDate);
Calendar caleMidMax = Calendar.getInstance();
int sequ = 1;
while (caleMidMin.before(caleEnd) || caleMidMin.equals(caleEnd)) {
int week = caleMidMin.get(Calendar.DAY_OF_WEEK) != 1 ? caleMidMin.get(Calendar.DAY_OF_WEEK) - 1 : 7;
caleMidMax.setTime(caleMidMin.getTime());
caleMidMax.add(Calendar.DATE,(7-week) + (frequency - 1)*7);
DateRangeEntity dre = new DateRangeEntity();
dre.setStartDate(caleMidMin.getTime());
dre.setEndDate(caleMidMax.getTime().compareTo(endDate) >= 0 ? endDate : caleMidMax.getTime());
dre.setSequence(sequ);
dreList.add(dre);
sequ ++;
caleMidMax.add(Calendar.DATE,1);
caleMidMin.setTime(caleMidMax.getTime());
}
return dreList;
}
3 按自然月切割时间段
private List<DateRangeEntity> splitDateByMonth(String startDateStr,String endDateStr,int frequency) throws ParseException {
Date startDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,startDateStr);
Date endDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,endDateStr);
Calendar caleEnd = Calendar.getInstance();
caleEnd.setTime(endDate);
Calendar caleMidMin = Calendar.getInstance();
caleMidMin.setTime(startDate);
Calendar caleMidMax = Calendar.getInstance();
int sequ = 1;
List<DateRangeEntity> dreList = new ArrayList<DateRangeEntity>();
while (caleMidMin.before(caleEnd) || caleMidMin.equals(caleEnd)) {
DateRangeEntity dre = new DateRangeEntity();
caleMidMax.setTime(caleMidMin.getTime());
caleMidMax.add(Calendar.MONTH,frequency - 1);
Date midMaxDate = convertStr2Date(caleMidMax.get(Calendar.YEAR),caleMidMax.get(Calendar.MONTH) + 1,caleMidMax.getActualMaximum(Calendar.DAY_OF_MONTH));
dre.setStartDate(caleMidMin.getTime());
dre.setEndDate(midMaxDate.compareTo(endDate) >= 0 ? endDate : midMaxDate);
dre.setSequence(sequ);
dreList.add(dre);
sequ ++;
caleMidMin.set(Calendar.DAY_OF_MONTH,1);
caleMidMin.add(Calendar.MONTH,frequency);
}
return dreList;
}
4 代码需要的内部类
class DateRangeEntity {
private Date startDate;
private Date endDate;
private int sequence;
public int getSequence() {
return sequence;
}
public void setSequence(int sequence) {
this.sequence = sequence;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
5 DateUtil工具类的简单实现
public class DateUtil {
private static final Logger logger = LoggerFactory.getLogger(com.fh.iasp.platform.util.DateUtil.class);
public static final String TIME_PATTERN = "HH:mm:ss";
public static final String DATE_PATTENT = "yyyy-MM-dd";
public static final String DATETIME_PATTENT = "yyyy-MM-dd HH:mm:ss";
public static final String YEAR_PATTENT = "yyyy";
public static final String YEAR_MONTH_PATTENT = "yyyy-MM";
public static final String YYYYMMDD_PATTERN = "yyyyMMdd";
private static final long MAX_DATE = 4102329600000L;
private static final long MIN_DATE = -2209017600000L;
public static Date string2Date(String pattern, String source) throws ParseException {
return stringToDate(pattern, source);
}
public static Date stringToDate(String aMask, String strDate) throws ParseException {
if (StringUtil.isEmpty(strDate)) {
return null;
}
SimpleDateFormat df;
Date date;
df = new SimpleDateFormat(aMask);
try {
date = df.parse(strDate);
if (date != null && (date.getTime() < MIN_DATE || date.getTime() > MAX_DATE)) {
throw new ParseException("日期格式超出有效范围", 0);
}
} catch (ParseException pe) {
throw new ParseException(pe.getMessage(), pe.getErrorOffset());
}
return date;
}
}