code: 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.setTimeZone(this.timeZone);
  		calendar.setTime(date);
  
  		// First, just reset the milliseconds and try to calculate from there...
  		calendar.set(Calendar.MILLISECOND, 0);
  		long originalTimestamp = calendar.getTimeInMillis();
  		doNext(calendar, calendar.get(Calendar.YEAR));
  
  		if (calendar.getTimeInMillis() == originalTimestamp) {
  			// We arrived at the original timestamp - round up to the next whole second and try again...
  			calendar.add(Calendar.SECOND, 1);
  			doNext(calendar, calendar.get(Calendar.YEAR));
  		}
  
  		return calendar.getTime();
  	}
docs: 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