Thank you for the correction. I guess I should be more specific. I read the following in the documentation for Calendar.roll(), but I didn't go to the GregorianCalendar API to see if it had any caveats documented there.
Time Field Rolling function. Add to field a signed amount without changing larger fields. A negative roll amount means to roll down. [NOTE: This default implementation on Calendar just repeatedly calls the version of roll() that takes a boolean and rolls by one unit. This may not always do the right thing. For example, if the DAY_OF_MONTH field is 31, rolling through February will leave it set to 28. The GregorianCalendar version of this function takes care of this problem. Other subclasses should also provide overrides of this function that do the right thing.
Mostly, it just looked like it might work, so I was trying to point the original poster in the direction that would (hopefully) answer his question. I should put disclaimers on such advice in the future.