投放时间解析

业务要求:

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工具类

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值