业务要求:
1.页面选择不限表示全部时间段投放 2.页面选择特定时间段 1)根据投放开始时间和结束时间判断是否大于7天,若大于7天则进行步骤3,4,否则进行步骤2,3,4 2)判断投放时间是否在页面选择的时间段,若有则遍历所有投放时间的周期,如投放开始时间2019-01-26,2019-01-27,2019-01-28 分别是周六,周日,周一,页面选择的时间段不在这个周期中排除 3)判断投放时间的周期里面是否有24小时,若有直接生成splot,若无,则将页面选择的时间段iden和times进行反转,得到times和iden的集合 4)遍历得到的集合,生成splot
@Test
public void testTimeSlot() throws ParseException {
List<SpotPlan> spotPlans = new ArrayList<>();
String startTimeStr = "2019-03-15 00:00:00";
String endTimeStr = "2019-03-20 23:59:59";
//投放开始时间(将字符串时间转换为Date)
Date startTime = DateUtils.parse(startTimeStr);
//投放结束时间(将字符串时间转换为Date)
Date endTime = DateUtils.parse(endTimeStr);
String timeSlot = "[{\"iden\":1,\"times\":[0]},{\"iden\":2,\"times\":[0]},{\"iden\":3,\"times\":[0]},"
+ "{\"iden\":4,\"times\":[0]},{\"iden\":5,\"times\":[0]},{\"iden\":6,\"times\":[0]},{\"iden\":0,"
+ "\"times\":[0]}]";
if (StringUtils.equals("0", timeSlot)) {
SpotPlan spotPlan = getFullSplot();
spotPlans.add(spotPlan);
} else {
//用gson解析json对象数组
List<TimeSlot> timeSlotParse = GsonUtils.stringToList(timeSlot, TimeSlot.class);
//根据投放时间重新生成新的TimeSlot
List<TimeSlot> timeSlotList = getTimeSlotList(timeSlotParse, startTime, endTime);
//封装反转的TimeSlot(正序存储)
TreeMap<Integer, List<Integer>> map = new TreeMap<>();
if (!CollectionUtils.isEmpty(timeSlotList)) {
for (TimeSlot slot : timeSlotList) {
if (slot.getTimes().size() == 24) {
//直接生成splot
SpotPlan spotPlan = getSplot(slot.getIden());
spotPlans.add(spotPlan);
} else {
//将页面选择的时间段iden和times进行反转,得到times和iden的集合
getConvertSlot(map, slot);
}
}
}
//遍历map生成splot
if (!MapUtils.isEmpty(map)) {
for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
SpotPlan spotPlan = new SpotPlan();
spotPlan.setDailyStartTime(entry.getKey() * 3600);
spotPlan.setDailyEndTime((entry.getKey() + 1) * 3600);
spotPlan.setDayOfWeek(map.get(entry.getKey()));
spotPlans.add(spotPlan);
}
}
}
System.out.println("spotPlans:" + GsonUtils.beanToString(spotPlans));
}
/**
* 得到全部24点
* @return
*/
private SpotPlan getFullSplot() {
SpotPlan spotPlan = new SpotPlan();
spotPlan.setDailyStartTime(0);
spotPlan.setDailyEndTime(86400);//24点转换为秒
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 7; i++) {
list.add(i);
}
spotPlan.setDayOfWeek(list);
return spotPlan;
}
/**
* 根据投放时间重新生成新的TimeSlot
* @param timeSlotParse 时间段
* @param startDate 投放开始时间
* @param endDate 投放结束时间
* @return 集合
*/
private List<TimeSlot> getTimeSlotList(List<TimeSlot> timeSlotParse, Date startDate, Date endDate) {
List<TimeSlot> timeSlotList = new ArrayList<>();
//投放天数
long dayServed = DateUtils.timeIntervalInDays(startDate, endDate) + 1;
if (dayServed < 7) {
//根据投放时间,获得所有日期的周期
List<Integer> codeList = getCode(startDate, endDate);
for (Integer code : codeList) {
for (TimeSlot slot : timeSlotParse) {
if (Objects.equals(code, slot.getIden())) {
timeSlotList.add(slot);
}
}
}
} else {
timeSlotList = timeSlotParse;
}
return timeSlotList;
}
/**
* 根据投放时间,获得所有日期的周期
* @param startDate
* @param endDate
* @return
*/
private List<Integer> getCode(Date startDate, Date endDate) {
List<Integer> codeList = new ArrayList<>();
//获取两个日期之间的所有日期
List<Date> betweenDate = DateUtils.getBetweenDate(startDate, endDate);
for (Date date : betweenDate) {
//返回当前日期是星期几
Integer code = DateUtils.getWeekOfDate(date);
codeList.add(code);
}
return codeList;
}
/**
* 获得指定周期的24点
* @param week 周几
* @return
*/
private SpotPlan getSplot(Integer week) {
SpotPlan spotPlan = new SpotPlan();
spotPlan.setDailyStartTime(0);
spotPlan.setDailyEndTime(86400);
List<Integer> list = new ArrayList<>();
list.add(week);
spotPlan.setDayOfWeek(list);
return spotPlan;
}
/**
* 将页面选择的时间段iden和times进行反转,得到times和iden的集合
* @param map
* @param slot
*/
private void getConvertSlot(TreeMap<Integer, List<Integer>> map, TimeSlot slot) {
for (Integer time : slot.getTimes()) {
if (map.containsKey(time)) {
List<Integer> timesList = map.get(time);
timesList.add(slot.getIden());
map.put(time, timesList);
} else {
List<Integer> timesList = new ArrayList<>();
timesList.add(slot.getIden());
map.put(time, timesList);
}
}
}
备注:
时间工具类:时间工具类
gson工具类:gson工具类