Java Code Examples for java.util.GregorianCalendar#clone()

The following examples show how to use java.util.GregorianCalendar#clone() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: RetentionAge.java    From Doradus with Apache License 2.0 6 votes vote down vote up
/**
 * Find the date on or before which objects expire based on the given date and the
 * retention age specified in this object. The given date is cloned and then adjusted
 * downward by the units and value in this RetentionAge.
 *
 * @param   relativeDate    Reference date.
 * @return  The date relative to the given one at which objects should be considered
 *          expired based on this RetentionAge.
 */
public GregorianCalendar getExpiredDate(GregorianCalendar relativeDate) {
    // Get today's date and adjust by the specified age.
    GregorianCalendar expiredDate = (GregorianCalendar)relativeDate.clone();
    switch (m_units) {
    case DAYS:
        expiredDate.add(Calendar.DAY_OF_MONTH, -m_value);
        break;
    case MONTHS:
        expiredDate.add(Calendar.MONTH, -m_value);
        break;
    case YEARS:
        expiredDate.add(Calendar.YEAR, -m_value);
        break;
    default:
        // New value we forgot to add here?
        throw new AssertionError("Unknown RetentionUnits: " + m_units);
    }
    return expiredDate;
}
 
Example 2
Source File: GregorianCalendarTest.java    From j2objc with Apache License 2.0 6 votes vote down vote up
/**
 * java.util.GregorianCalendar#clone()
 */
public void test_clone() {

    // Regression for HARMONY-498
    GregorianCalendar gCalend = new GregorianCalendar();

    gCalend.set(Calendar.MILLISECOND, 0);
    int dayOfMonth = gCalend.get(Calendar.DAY_OF_MONTH);

    // create clone object and change date
    GregorianCalendar gCalendClone = (GregorianCalendar) gCalend.clone();
    gCalendClone.add(Calendar.DATE, 1);

    assertEquals("Before", dayOfMonth, gCalend.get(Calendar.DAY_OF_MONTH));
    gCalend.set(Calendar.MILLISECOND, 0);//changes nothing
    assertEquals("After", dayOfMonth, gCalend.get(Calendar.DAY_OF_MONTH));
}
 
Example 3
Source File: MessageCounter.java    From activemq-artemis with Apache License 2.0 6 votes vote down vote up
/**
 * Constructor
 *
 * @param date       day counter date
 * @param isStartDay true  first day counter
 *                   false follow up day counter
 */
DayCounter(final GregorianCalendar date, final boolean isStartDay) {
   // store internal copy of creation date
   this.date = (GregorianCalendar) date.clone();

   // initialize the array with '0'- values to current hour (if it is not the
   // first monitored day) and the rest with default values ('-1')
   int hour = date.get(Calendar.HOUR_OF_DAY);

   for (int i = 0; i < DayCounter.HOURS; i++) {
      if (i < hour) {
         if (isStartDay) {
            counters[i] = -1L;
         } else {
            counters[i] = 0L;
         }
      } else {
         counters[i] = -1L;
      }
   }

   // set the array element of the current hour to '0'
   counters[hour] = 0L;
}
 
Example 4
Source File: bug4028518.java    From TencentKona-8 with GNU General Public License v2.0 5 votes vote down vote up
public static void main(String[] args)
{
    GregorianCalendar cal1 = new GregorianCalendar() ;
    GregorianCalendar cal2 = (GregorianCalendar) cal1.clone() ;

    printdate(cal1, "cal1: ") ;
    printdate(cal2, "cal2 - cloned(): ") ;
    cal1.add(DAY_OF_MONTH, 1) ;
    printdate(cal1, "cal1 after adding 1 day: ") ;
    printdate(cal2, "cal2 should be unmodified: ") ;
    if (cal1.get(DAY_OF_MONTH) == cal2.get(DAY_OF_MONTH)) {
        throw new RuntimeException("cloned GregorianCalendar modified");
    }
}
 
Example 5
Source File: DateChooser.java    From pdfxtk with Apache License 2.0 5 votes vote down vote up
DayChooser(DateChooser dc_, GregorianCalendar date, char[] days) {
  dc = dc_;
  
  setLayout(new GridLayout(7, 7));
  
  for(int i = 0; i < days.length; i++)
    add(new Label("" + days[i], Label.CENTER));
  
  Calendar tmp = (Calendar)date.clone();
  tmp.set(Calendar.DAY_OF_MONTH, 1);
  int skip = tmp.get(Calendar.DAY_OF_WEEK) - 1;
  for(int i = 0; i < skip; i++)
    add(new Component() {});
  
  int count = days(date);
  for(int i = 1; i <= count; i++) {
    b_days[i] = new Button("" + i);
    b_days[i].addActionListener(this);
    add(b_days[i]);
  }

  skip = 49 - getComponentCount();
  for(int i = 0; i < skip; i++)
    add(new Component() {});

  select(date.get(Calendar.DAY_OF_MONTH));
}
 
Example 6
Source File: CalendarAdapter.java    From Android-Calendar-Sync with Apache License 2.0 5 votes vote down vote up
public void refreshDays() {
	// clear items
	items.clear();
	dayString.clear();
	Locale.setDefault(Locale.US);
	pmonth = (GregorianCalendar) month.clone();
	// month start day. ie; sun, mon, etc
	firstDay = month.get(GregorianCalendar.DAY_OF_WEEK);
	// finding number of weeks in current month.
	maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH);
	// allocating maximum row number for the gridview.
	mnthlength = maxWeeknumber * 7;
	maxP = getMaxP(); // previous month maximum day 31,30....
	calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ...
	/**
	 * Calendar instance for getting a complete gridview including the three
	 * month's (previous,current,next) dates.
	 */
	pmonthmaxset = (GregorianCalendar) pmonth.clone();
	/**
	 * setting the start date as previous month's required date.
	 */
	pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1);

	/**
	 * filling calendar gridview.
	 */
	for (int n = 0; n < mnthlength; n++) {

		itemvalue = df.format(pmonthmaxset.getTime());
		pmonthmaxset.add(GregorianCalendar.DATE, 1);
		dayString.add(itemvalue);

	}
}
 
Example 7
Source File: CalendarAdapter.java    From Android-Calendar-Sync with Apache License 2.0 5 votes vote down vote up
public CalendarAdapter(Context c, GregorianCalendar monthCalendar) {
	CalendarAdapter.dayString = new ArrayList<String>();
	Locale.setDefault(Locale.US);
	month = monthCalendar;
	selectedDate = (GregorianCalendar) monthCalendar.clone();
	mContext = c;
	month.set(GregorianCalendar.DAY_OF_MONTH, 1);
	this.items = new ArrayList<String>();
	df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
	curentDateString = df.format(selectedDate.getTime());
	refreshDays();
}
 
Example 8
Source File: Utils.java    From Doradus with Apache License 2.0 5 votes vote down vote up
/**
 * Truncate the given GregorianCalendar date to the nearest week. This is done by
 * cloning it and rounding the value down to the closest Monday. If the given date
 * already occurs on a Monday, a copy of the same date is returned.
 * 
 * @param   date    A GregorianCalendar object.
 * @return          A copy of the same value, truncated to the nearest Monday.
 */
public static GregorianCalendar truncateToWeek(GregorianCalendar date) {
    // Round the date down to the MONDAY of the same week.
    GregorianCalendar result = (GregorianCalendar)date.clone();
    switch (result.get(Calendar.DAY_OF_WEEK)) {
        case Calendar.TUESDAY:   result.add(Calendar.DAY_OF_MONTH, -1); break;
        case Calendar.WEDNESDAY: result.add(Calendar.DAY_OF_MONTH, -2); break;
        case Calendar.THURSDAY:  result.add(Calendar.DAY_OF_MONTH, -3); break;
        case Calendar.FRIDAY:    result.add(Calendar.DAY_OF_MONTH, -4); break;
        case Calendar.SATURDAY:  result.add(Calendar.DAY_OF_MONTH, -5); break;
        case Calendar.SUNDAY:    result.add(Calendar.DAY_OF_MONTH, -6); break;
        default: break;
    }
    return result;
}
 
Example 9
Source File: CalendarAdapter.java    From MFCalendarView with Mozilla Public License 2.0 5 votes vote down vote up
public void refreshDays() {
	// clear items
	items.clear();
	dayString.clear();

	pmonth = (GregorianCalendar) month.clone();
	// month start day. ie; sun, mon, etc
	firstDay = month.get(GregorianCalendar.DAY_OF_WEEK);
	// finding number of weeks in current month.
	maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH);
	// allocating maximum row number for the gridview.
	mnthlength = maxWeeknumber * 7;
	maxP = getMaxP(); // previous month maximum day 31,30....
	calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ...
	/**
	 * Calendar instance for getting a complete gridview including the three
	 * month's (previous,current,next) dates.
	 */
	pmonthmaxset = (GregorianCalendar) pmonth.clone();
	/**
	 * setting the start date as previous month's required date.
	 */
	pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1);

	/**
	 * filling calendar gridview.
	 */
	for (int n = 0; n < mnthlength; n++) {

		itemvalue = df.format(pmonthmaxset.getTime());
		pmonthmaxset.add(GregorianCalendar.DATE, 1);
		dayString.add(itemvalue);

	}
}
 
Example 10
Source File: CalendarAdapter.java    From MFCalendarView with Mozilla Public License 2.0 5 votes vote down vote up
public void initCalendarAdapter(GregorianCalendar monthCalendar,
		onMFCalendarViewListener calendarListener){
	CalendarAdapter.dayString = new ArrayList<String>();
	month = monthCalendar;
	
	selectedDate = (GregorianCalendar) monthCalendar.clone();
	
	month.set(GregorianCalendar.DAY_OF_MONTH, 1);
	this.items = new ArrayList<String>();
	
	adaptersetDate(selectedDate, calendarListener);
	refreshDays();
}
 
Example 11
Source File: bug4028518.java    From jdk8u_jdk with GNU General Public License v2.0 5 votes vote down vote up
public static void main(String[] args)
{
    GregorianCalendar cal1 = new GregorianCalendar() ;
    GregorianCalendar cal2 = (GregorianCalendar) cal1.clone() ;

    printdate(cal1, "cal1: ") ;
    printdate(cal2, "cal2 - cloned(): ") ;
    cal1.add(DAY_OF_MONTH, 1) ;
    printdate(cal1, "cal1 after adding 1 day: ") ;
    printdate(cal2, "cal2 should be unmodified: ") ;
    if (cal1.get(DAY_OF_MONTH) == cal2.get(DAY_OF_MONTH)) {
        throw new RuntimeException("cloned GregorianCalendar modified");
    }
}
 
Example 12
Source File: CalendarRegression.java    From openjdk-jdk9 with GNU General Public License v2.0 5 votes vote down vote up
/**
 * GregorianCalendar.equals() ignores cutover date
 */
public void Test4141665() {
    GregorianCalendar cal = new GregorianCalendar();
    GregorianCalendar cal2 = (GregorianCalendar) cal.clone();
    Date cut = cal.getGregorianChange();
    Date cut2 = new Date(cut.getTime() + 100 * 24 * 60 * 60 * 1000L); // 100 days later
    if (!cal.equals(cal2)) {
        errln("Cloned GregorianCalendars not equal");
    }
    cal2.setGregorianChange(cut2);
    if (cal.equals(cal2)) {
        errln("GregorianCalendar.equals() ignores cutover");
    }
}
 
Example 13
Source File: bug4028518.java    From openjdk-jdk9 with GNU General Public License v2.0 5 votes vote down vote up
public static void main(String[] args)
{
    GregorianCalendar cal1 = new GregorianCalendar() ;
    GregorianCalendar cal2 = (GregorianCalendar) cal1.clone() ;

    printdate(cal1, "cal1: ") ;
    printdate(cal2, "cal2 - cloned(): ") ;
    cal1.add(DAY_OF_MONTH, 1) ;
    printdate(cal1, "cal1 after adding 1 day: ") ;
    printdate(cal2, "cal2 should be unmodified: ") ;
    if (cal1.get(DAY_OF_MONTH) == cal2.get(DAY_OF_MONTH)) {
        throw new RuntimeException("cloned GregorianCalendar modified");
    }
}
 
Example 14
Source File: AutoSwitchThemeController.java    From Musicoco with Apache License 2.0 5 votes vote down vote up
public void setAlarm() {

        // UPDATE: 2017/8/24 更新 时间段自定义
        current = Calendar.getInstance();
        nightThemeStart = new GregorianCalendar(
                current.get(Calendar.YEAR),
                current.get(Calendar.MONTH),
                current.get(Calendar.DAY_OF_MONTH),
                22, 30); // 22:30 切换到夜间模式

        nightThemeEnd = (Calendar) nightThemeStart.clone();
        nightThemeEnd.add(Calendar.DAY_OF_MONTH, 1); // 后一天
        nightThemeEnd.set(Calendar.HOUR_OF_DAY, 7); // 07:00 切换到白天模式
        nightThemeEnd.set(Calendar.MINUTE, 0);

        checkTheme();
        isSet = true;

        Intent intentS = new Intent();
        Intent intentE = new Intent();

        intentS.setAction(BroadcastManager.FILTER_APP_THEME_CHANGE_AUTOMATIC);
        intentS.putExtra(BroadcastManager.APP_THEME_CHANGE_AUTOMATIC_TOKEN,
                BroadcastManager.APP_THEME_CHANGE_AUTOMATIC_DARK);

        intentE.setAction(BroadcastManager.FILTER_APP_THEME_CHANGE_AUTOMATIC);
        intentE.putExtra(BroadcastManager.APP_THEME_CHANGE_AUTOMATIC_TOKEN,
                BroadcastManager.APP_THEME_CHANGE_AUTOMATIC_WHITE);

        piS = PendingIntent.getBroadcast(context, 0, intentS, 0);
        piE = PendingIntent.getBroadcast(context, 1, intentE, 0);

        alarmManager.set(AlarmManager.RTC_WAKEUP, nightThemeStart.getTimeInMillis(), piS);
        alarmManager.set(AlarmManager.RTC_WAKEUP, nightThemeEnd.getTimeInMillis(), piE);

    }
 
Example 15
Source File: bug4028518.java    From openjdk-jdk8u with GNU General Public License v2.0 5 votes vote down vote up
public static void main(String[] args)
{
    GregorianCalendar cal1 = new GregorianCalendar() ;
    GregorianCalendar cal2 = (GregorianCalendar) cal1.clone() ;

    printdate(cal1, "cal1: ") ;
    printdate(cal2, "cal2 - cloned(): ") ;
    cal1.add(DAY_OF_MONTH, 1) ;
    printdate(cal1, "cal1 after adding 1 day: ") ;
    printdate(cal2, "cal2 should be unmodified: ") ;
    if (cal1.get(DAY_OF_MONTH) == cal2.get(DAY_OF_MONTH)) {
        throw new RuntimeException("cloned GregorianCalendar modified");
    }
}
 
Example 16
Source File: bug4028518.java    From dragonwell8_jdk with GNU General Public License v2.0 5 votes vote down vote up
public static void main(String[] args)
{
    GregorianCalendar cal1 = new GregorianCalendar() ;
    GregorianCalendar cal2 = (GregorianCalendar) cal1.clone() ;

    printdate(cal1, "cal1: ") ;
    printdate(cal2, "cal2 - cloned(): ") ;
    cal1.add(DAY_OF_MONTH, 1) ;
    printdate(cal1, "cal1 after adding 1 day: ") ;
    printdate(cal2, "cal2 should be unmodified: ") ;
    if (cal1.get(DAY_OF_MONTH) == cal2.get(DAY_OF_MONTH)) {
        throw new RuntimeException("cloned GregorianCalendar modified");
    }
}
 
Example 17
Source File: BTCommandManager.java    From redalert-android with Apache License 2.0 4 votes vote down vote up
public void handleActivityNotif(byte[] value) {
    boolean firstChunk = activityStruct == null;
    if (firstChunk) {
        activityStruct = new ActivityStruct();
    }

    if (value.length == 11) {
        // byte 0 is the data type: 1 means that each minute is represented by a triplet of bytes
        int dataType = value[0];
        // byte 1 to 6 represent a timestamp
        GregorianCalendar timestamp = parseTimestamp(value, 1);

        // counter of all data held by the band
        int totalDataToRead = (value[7] & 0xff) | ((value[8] & 0xff) << 8);
        totalDataToRead *= (dataType == 1) ? 3 : 1;


        // counter of this data block
        int dataUntilNextHeader = (value[9] & 0xff) | ((value[10] & 0xff) << 8);
        dataUntilNextHeader *= (dataType == 1) ? 3 : 1;

        // there is a total of totalDataToRead that will come in chunks (3 bytes per minute if dataType == 1),
        // these chunks are usually 20 bytes long and grouped in blocks
        // after dataUntilNextHeader bytes we will get a new packet of 11 bytes that should be parsed
        // as we just did

        if (firstChunk && dataUntilNextHeader != 0) {
            String message = String.format("About to transfer %1$s of data starting from %2$s",
                    (totalDataToRead / 3),
                    DateFormat.getDateTimeInstance().format(timestamp.getTime()));
            Toast.makeText(context, message, Toast.LENGTH_LONG).show();
        }

        Log.i(TAG, "total data to read: " + totalDataToRead + " len: " + (totalDataToRead / 3) + " minute(s)");
        Log.i(TAG, "data to read until next header: " + dataUntilNextHeader + " len: " + (dataUntilNextHeader / 3) + " minute(s)");
        Log.i(TAG, "TIMESTAMP: " + DateFormat.getDateTimeInstance().format(timestamp.getTime()) + " magic byte: " + dataUntilNextHeader);

        activityStruct.activityDataRemainingBytes = activityStruct.activityDataUntilNextHeader = dataUntilNextHeader;
        activityStruct.activityDataTimestampToAck = (GregorianCalendar) timestamp.clone();
        activityStruct.activityDataTimestampProgress = timestamp;

    } else {
        bufferActivityData(value);
    }

    Log.e(TAG, "activity data: length: " + value.length + ", remaining bytes: " + activityStruct.activityDataRemainingBytes);

    if (activityStruct.activityDataRemainingBytes == 0) {
        sendAckDataTransfer(activityStruct.activityDataTimestampToAck, activityStruct.activityDataUntilNextHeader);
    }
}
 
Example 18
Source File: BTCommandManager.java    From Mi-Band with GNU General Public License v2.0 4 votes vote down vote up
public void handleActivityNotif(byte[] value) {
    boolean firstChunk = activityStruct == null;
    if (firstChunk) {
        activityStruct = new ActivityStruct();
    }

    if (value.length == 11) {
        // byte 0 is the data type: 1 means that each minute is represented by a triplet of bytes
        int dataType = value[0];
        // byte 1 to 6 represent a timestamp
        GregorianCalendar timestamp = parseTimestamp(value, 1);

        // counter of all data held by the band
        int totalDataToRead = (value[7] & 0xff) | ((value[8] & 0xff) << 8);
        totalDataToRead *= (dataType == 1) ? 3 : 1;


        // counter of this data block
        int dataUntilNextHeader = (value[9] & 0xff) | ((value[10] & 0xff) << 8);
        dataUntilNextHeader *= (dataType == 1) ? 3 : 1;

        // there is a total of totalDataToRead that will come in chunks (3 bytes per minute if dataType == 1),
        // these chunks are usually 20 bytes long and grouped in blocks
        // after dataUntilNextHeader bytes we will get a new packet of 11 bytes that should be parsed
        // as we just did

        if (firstChunk && dataUntilNextHeader != 0) {
            String message = String.format("About to transfer %1$s of data starting from %2$s",
                    (totalDataToRead / 3),
                    DateFormat.getDateTimeInstance().format(timestamp.getTime()));
            Toast.makeText(context, message, Toast.LENGTH_LONG).show();
        }

        Log.i(TAG, "total data to read: " + totalDataToRead + " len: " + (totalDataToRead / 3) + " minute(s)");
        Log.i(TAG, "data to read until next header: " + dataUntilNextHeader + " len: " + (dataUntilNextHeader / 3) + " minute(s)");
        Log.i(TAG, "TIMESTAMP: " + DateFormat.getDateTimeInstance().format(timestamp.getTime()) + " magic byte: " + dataUntilNextHeader);

        activityStruct.activityDataRemainingBytes = activityStruct.activityDataUntilNextHeader = dataUntilNextHeader;
        activityStruct.activityDataTimestampToAck = (GregorianCalendar) timestamp.clone();
        activityStruct.activityDataTimestampProgress = timestamp;

    } else {
        bufferActivityData(value);
    }

    Log.e(TAG, "activity data: length: " + value.length + ", remaining bytes: " + activityStruct.activityDataRemainingBytes);

    if (activityStruct.activityDataRemainingBytes == 0) {
        sendAckDataTransfer(activityStruct.activityDataTimestampToAck, activityStruct.activityDataUntilNextHeader);
    }
}
 
Example 19
Source File: CalendarRegression.java    From openjdk-jdk9 with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Calendar and GregorianCalendar hashCode() methods need improvement.
 * Calendar needs a good implementation that subclasses can override,
 * and GregorianCalendar should use that implementation.
 */
public void Test4136399() {
    /* Note: This test is actually more strict than it has to be.
    * Technically, there is no requirement that unequal objects have
    * unequal hashes.  We only require equal objects to have equal hashes.
    * It is desirable for unequal objects to have distributed hashes, but
    * there is no hard requirement here.
    *
    * In this test we make assumptions about certain attributes of calendar
    * objects getting represented in the hash, which need not always be the
    * case (although it does work currently with the given test). */
    Calendar a = Calendar.getInstance();
    Calendar b = (Calendar) a.clone();
    if (a.hashCode() != b.hashCode()) {
        errln("Calendar hash code unequal for cloned objects");
    }

    b.setMinimalDaysInFirstWeek(7 - a.getMinimalDaysInFirstWeek());
    if (a.hashCode() == b.hashCode()) {
        errln("Calendar hash code ignores minimal days in first week");
    }
    b.setMinimalDaysInFirstWeek(a.getMinimalDaysInFirstWeek());

    b.setFirstDayOfWeek((a.getFirstDayOfWeek() % 7) + 1); // Next day
    if (a.hashCode() == b.hashCode()) {
        errln("Calendar hash code ignores first day of week");
    }
    b.setFirstDayOfWeek(a.getFirstDayOfWeek());

    b.setLenient(!a.isLenient());
    if (a.hashCode() == b.hashCode()) {
        errln("Calendar hash code ignores lenient setting");
    }
    b.setLenient(a.isLenient());

    // Assume getTimeZone() returns a reference, not a clone
    // of a reference -- this is true as of this writing
    b.getTimeZone().setRawOffset(a.getTimeZone().getRawOffset() + 60 * 60 * 1000);
    if (a.hashCode() == b.hashCode()) {
        errln("Calendar hash code ignores zone");
    }
    b.getTimeZone().setRawOffset(a.getTimeZone().getRawOffset());

    GregorianCalendar c = new GregorianCalendar();
    GregorianCalendar d = (GregorianCalendar) c.clone();
    if (c.hashCode() != d.hashCode()) {
        errln("GregorianCalendar hash code unequal for clones objects");
    }
    Date cutover = c.getGregorianChange();
    d.setGregorianChange(new Date(cutover.getTime() + 24 * 60 * 60 * 1000));
    if (c.hashCode() == d.hashCode()) {
        errln("GregorianCalendar hash code ignores cutover");
    }
}
 
Example 20
Source File: Schedule.java    From fosstrak-epcis with GNU Lesser General Public License v2.1 3 votes vote down vote up
/**
 * Calculates the next scheduled time after the given time. Algorithm idea:<br> -
 * start with biggest time unit (i.e. year) of the given time <br> - if the
 * time unit is valid (e.g. the time unit matches the <br>
 * scheduled time, this is implicitly true if the time in the <br>
 * schedule was omitted) *and* there exists a valid smaller time <br>
 * unit, *then* return this time unit <br> - do this recursively for all
 * time units <br> - month needs to be special cased because of dayOfWeek
 * 
 * @param time
 *            Time after which next scheduled time should be returned.
 * @return The next scheduled time after 'time'.
 * @throws ImplementationException
 *             Almost any kind of error.
 */
public GregorianCalendar nextScheduledTime(final GregorianCalendar time) throws ImplementationExceptionResponse {
    GregorianCalendar nextSchedule = (GregorianCalendar) time.clone();
    // look at year
    while (!monthMadeValid(nextSchedule)) {
        nextSchedule.roll(YEAR, true);
        setFieldsToMinimum(nextSchedule, MONTH);

    }
    return nextSchedule;
}