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;
	}
@Test
	void getTimeBefore() throws ParseException {
		CronExpression cronExpression = new CronExpression("0 0 8 1 JAN ?");
		Date beforeDate = cronExpression.getTimeBefore(new Date());
		System.out.println(beforeDate);
		assertThat(beforeDate).isNotNull();

		cronExpression = new CronExpression("0 */5 * * * ?");
		beforeDate = cronExpression.getTimeBefore(new Date());
		System.out.println(beforeDate);
		assertThat(beforeDate).isNotNull();
	}