需求
网上找了一下 大部分都是用Calendar做的 下方Calendar实现按月分组
需要引入包:
org.apache.commons
commons-lang3
3.7
类代码如下:
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.time.DateUtils;
public class DateRange {
private Date start;
private Date end;
public DateRange() {
super();
}
public DateRange(Date start, Date end) {
super();
this.start = start;
this.end = end;
}
/**
* 判断时间范围是否不为空,即开始时间不在结束时间之后
*/
public boolean isNotEmptyDateRange() {
return start.before(end) || start.equals(end);
}
public ListsplitByMonth() {
Listresult = new ArrayList<>();
if(!this.isNotEmptyDateRange()) {
return result;
}
Calendar sc = Calendar.getInstance();
sc.setTime(start);
Calendar ec = Calendar.getInstance();
ec.setTime(end);
if (this.isSameMonth(sc, ec)) {
result.add(this);
return result;
}
while(sc.before(ec)) {
DateRange d = new DateRange();
d.setStart(sc.getTime());
//向时间点之后取整,这里以月取整,就是下月初第一天零点
//还有一个方法是truncate是向之前的时间取整,和celling正好相反
//为什么celling有向后取整的意思,因为吊灯,天花板,之类的英文就是celling
sc = DateUtils.ceiling(sc, Calendar.MONTH);
//这里主要考虑最后一个月的情况,这个if其实可以提到while外面,性能会更好一点
//我懒得提了
if(sc.before(ec)) {
d.setEnd(sc.getTime());
} else {<