时间段按照天数或者小时分割
/**
-
@author Christ
-
@version 1.0
-
@date 2021/4/22 13:28
/
public class DateRangeUtil {
/*- 按小时计算
- @param begin 开始时间
- @param end 结束时间
- @return 集合
*/
public static List splitDateRangeByHour(Date begin, Date end) {
System.out.println(“按小时切割”);
Calendar calendar = Calendar.getInstance();
calendar.setTime(begin);
List list = Lists.newArrayList();
DateRange range = new DateRange();
range.setBegin(begin);
while (true) {
calendar.add(Calendar.HOUR_OF_DAY, 1);
if (calendar.getTime().after(end)) {
range.setEnd(end);
list.add(range);
break;
}
if (calendar.get(Calendar.HOUR_OF_DAY) == 23) {
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 0);
range.setEnd(calendar.getTime());
list.add(range);
//第二天时间计算,并创建新的时间段
calendar.add(Calendar.SECOND, 1);
range = new DateRange();
range.setBegin(calendar.getTime());
continue;
}
}
return list;
}
/**
-
按天计算分隔(效率高 ,只超过一天有问题)
-
@param begin 开始时间
-
@param end 结束时间
-
@return 集合
/
public static List splitDateRangeByDay(Date begin, Date end) {
System.out.println(“按天切割”);
long time = end.getTime() - begin.getTime();
if (time == 0) {
return Lists.newArrayList();
}
long hours = time / (60 * 60 * 1000);
if (time % (60 * 60 * 1000) > 0) {
hours += 1;
}
if (hours <= 24) {
return splitDateRangeByHour(begin, end);
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(begin);
List list = Lists.newArrayList();
DateRange range = new DateRange();
range.setBegin(begin);
while (true) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
if (calendar.getTime().after(end)) {
range.setEnd(end);
list.add(range);
break;
}
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
//今天的开始
Date tmpBeginTime = calendar.getTime();
//计算出上一天的最后一秒
calendar.add(Calendar.SECOND, -1);
range.setEnd(calendar.getTime());
list.add(range);
//创建新的时间段
range = new DateRange();
range.setBegin(tmpBeginTime);
//回到今天
calendar.add(Calendar.SECOND, +1);
}
return list;
}
/* -
按天计算分隔,优化版
-
@param begin 开始时间
-
@param end 结束时间
-
@return 集合
*/
public static List splitDateByBeginAndEnd(Date begin, Date end) {
long days = DateUtil.betweenDay(begin, end, true);
ArrayList DateRangeList = new ArrayList<>();
if (DateUtil.isSameDay(begin,end)) {
DateRange dateRange = new DateRange();
dateRange.setEnd(end);
dateRange.setBegin(begin);
DateRangeList.add(dateRange);
return DateRangeList;
}
for (int i = 0; i < days+1; i++) {
Date endDateTime = DateUtil.endOfDay(begin);
DateRange dateRange = new DateRange();
dateRange.setBegin(begin);
if (endDateTime.getTime()>end.getTime()){
dateRange.setEnd(end);
}else {
long time = endDateTime.getTime();
Date endDate = new Date(time+1);
dateRange.setEnd(endDate);
}
DateRangeList.add(dateRange);
long time = endDateTime.getTime();
begin = new Date(time+1);
// Calendar ca = Calendar.getInstance();
// ca.setTime(endDateTime);
// ca.add(Calendar.SECOND, 1);
// begin = ca.getTime();}
return DateRangeList;
}
}