code: @Override
    public long getNextIncludedTime (final long timeInMillis)
    {
      long nextIncludedTime = timeInMillis + 1; // plus on millisecond
  
      while (!isTimeIncluded (nextIncludedTime))
      {
  
        // If the time is in a range excluded by this calendar, we can
        // move to the end of the excluded time range and continue testing
        // from there. Otherwise, if nextIncludedTime is excluded by the
        // baseCalendar, ask it the next time it includes and begin testing
        // from there. Failing this, add one millisecond and continue
        // testing.
        if (m_aCronExpression.isSatisfiedBy (new Date (nextIncludedTime)))
        {
          nextIncludedTime = m_aCronExpression.getNextInvalidTimeAfter (new Date (nextIncludedTime)).getTime ();
        }
        else
          if ((getBaseCalendar () != null) && (!getBaseCalendar ().isTimeIncluded (nextIncludedTime)))
          {
            nextIncludedTime = getBaseCalendar ().getNextIncludedTime (nextIncludedTime);
          }
          else
          {
            nextIncludedTime++;
          }
      }
  
      return nextIncludedTime;
    }
docs: Determines the next time included by the <CODE>CronCalendar</CODE> after
  the specified time.
  
  @param timeInMillis
  the initial date/time after which to find an included time
  @return the time in milliseconds representing the next time included after
  the specified time.