/** * Get the next {@link Date} in the sequence matching the Cron pattern and * after the value provided. The return value will have a whole number of * seconds, and will be after the input value. * * @param date a seed value * @return the next value matching the pattern */ public Date next(Date date) { /* The plan: 1 Round up to the next whole second 2 If seconds match move on, otherwise find the next match: 2.1 If next match is in the next minute then roll forwards 3 If minute matches move on, otherwise find the next match 3.1 If next match is in the next hour then roll forwards 3.2 Reset the seconds and go to 2 4 If hour matches move on, otherwise find the next match 4.1 If next match is in the next day then roll forwards, 4.2 Reset the minutes and seconds and go to 2 ... */ Calendar calendar = new GregorianCalendar(); calendar.setTime(date); // Truncate to the next whole second calendar.add(Calendar.SECOND, 1); calendar.set(Calendar.MILLISECOND, 0); doNext(calendar); return calendar.getTime(); }