不同时间类型的执行计划计算

1.问题描述:

待叙。。。

2.代码:
public class DateTimeUtil {
	private static final DateTimeFormatter DAY_FULL_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	/**
	 * 按类型和起始时间获取所有执行时间列表
	 * @param startTime 开始时间
	 * @param endTime 结束时间
	 * @param type 类型: day(天), week(周), month(月), quarter(季度), year(年)
	 * @return 执行日期列表
	 */
	public static List<String> getExecuteDaysByType(String type, LocalDateTime startTime, LocalDateTime endTime) {
		LocalDate startDate = startTime.toLocalDate(), endDate = endTime.toLocalDate();

		LocalDateTime now = LocalDateTime.now();
		LocalDate today = now.toLocalDate();

		if("day".equalsIgnoreCase(type)){
			if(startDate.isBefore(today)){
				startDate = today;
			}
			return getExecDays(startDate, endDate, now, date -> date.plusDays(1));
		}

		if("week".equalsIgnoreCase(type)){
			//开始时间对应的周一
			startDate = startDate.minusDays(startDate.getDayOfWeek().getValue()-1);
			//本周一
			LocalDate currMonday = today.minusDays(today.getDayOfWeek().getValue()-1);

			if(startDate.isBefore(currMonday)){
				startDate = currMonday;
			}

			return getExecDays(startDate, endDate, now, date -> date.plusDays(7));
		}

		if("month".equalsIgnoreCase(type)){
			//开始时间当月1号
			startDate = LocalDate.of(startDate.getYear(), startDate.getMonthValue(), 1);
			//本月1号
			LocalDate currMonth = LocalDate.of(today.getYear(), today.getMonthValue(), 1);

			if(startDate.isBefore(currMonth)){
				startDate = currMonth;
			}

			return getExecDays(startDate, endDate, now, date -> date.plusMonths(1));
		}
		if("quarter".equalsIgnoreCase(type)){
			//开始时间当季度首月1号
			startDate = LocalDate.of(startDate.getYear(), startDate.getMonth().firstMonthOfQuarter(), 1);
			//本季度首月1号
			LocalDate currQuarter = LocalDate.of(today.getYear(), today.getMonth().firstMonthOfQuarter(), 1);

			if(startDate.isBefore(currQuarter)){
				startDate = currQuarter;
			}

			return getExecDays(startDate, endDate, now, date -> date.plusMonths(3));
		}
		if("year".equalsIgnoreCase(type)){
			//开始时间当年首月1号
			startDate = LocalDate.of(startDate.getYear(), 1, 1);
			//本年度首月1号
			LocalDate currYear = LocalDate.of(today.getYear(), 1, 1);

			if(startDate.isBefore(currYear)){
				startDate = currYear;
			}

			return getExecDays(startDate, endDate, now, date -> date.plusYears(1));
		}

		return Collections.emptyList();
	}

	private static List<String> getExecDays(LocalDate startDate, LocalDate endDate, LocalDateTime now, Function<LocalDate, LocalDate> timePlus){
		LocalDate today = now.toLocalDate();
		List<String> execDays = new ArrayList<>();

		while(!startDate.isAfter(endDate)){
			if(!startDate.isAfter(today)){
				//执行时间在今天及今天以前,则在当前时间5分钟后执行
				execDays.add(now.plusMinutes(5).format(DAY_FULL_FMT));
			}else{
				execDays.add(startDate.atStartOfDay().format(DAY_FULL_FMT));
			}
			//下一个执行日期
			startDate = timePlus.apply(startDate);
		}

		return execDays;
	}
}
4.Test:
public static void main(String[] args) {
	LocalDateTime startTime = LocalDateTime.of(2020, 7, 1, 12, 0, 0);
	LocalDateTime endTime = LocalDateTime.of(2022, 6, 1, 0, 0, 0);
	System.out.println(DateTimeUtil.getExecuteDaysByType("year", startTime, endTime));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值