protected Date getTimeBefore(final Date targetDate) {
		final Calendar cl = Calendar.getInstance(getTimeZone());

		// CronTrigger does not deal with milliseconds, so truncate target
		cl.setTime(targetDate);
		cl.set(Calendar.MILLISECOND, 0);
		final Date targetDateNoMs = cl.getTime();

		// to match this
		Date start = targetDateNoMs;
		final long minIncrement = findMinIncrement();
		Date prevFireTime;
		do {
			final Date prevCheckDate = new Date(start.getTime() - minIncrement);
			prevFireTime = getTimeAfter(prevCheckDate);
			if (prevFireTime == null || prevFireTime.before(MIN_DATE)) {
				return null;
			}
			start = prevCheckDate;
		} while (prevFireTime.compareTo(targetDateNoMs) >= 0);
		return prevFireTime;
	}
Advance the calendar to the particular hour paying particular attention
to daylight saving problems.

@param cal  the calendar to operate on
@param hour the hour to set
spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-schedulerx/src/main/java/com/alibaba/cloud/scheduling/schedulerx/util/CronExpression.java