{
  public void add(int field, int amount)  {    switch (field)      {      case YEAR:				complete();				fields[YEAR] += amount;				isTimeSet = false;				break;      case MONTH:				complete();				int months = fields[MONTH] + amount;				fields[YEAR] += months / 12;				fields[MONTH] = months % 12;	if (fields[MONTH] < 0)	  {					fields[MONTH] += 12;					fields[YEAR]--;				}				int maxDay = getActualMaximum(DAY_OF_MONTH);	if (fields[DAY_OF_MONTH] > maxDay)	  {					fields[DAY_OF_MONTH] = maxDay;				}	set(YEAR, fields[YEAR]);	set(MONTH, fields[MONTH]);				break;      case DAY_OF_MONTH:      case DAY_OF_YEAR:      case DAY_OF_WEEK:	if (! isTimeSet)					computeTime();				time += amount * (24 * 60 * 60 * 1000L);				areFieldsSet = false;				break;      case WEEK_OF_YEAR:      case WEEK_OF_MONTH:      case DAY_OF_WEEK_IN_MONTH:	if (! isTimeSet)					computeTime();				time += amount * (7 * 24 * 60 * 60 * 1000L);				areFieldsSet = false;				break;      case AM_PM:	if (! isTimeSet)					computeTime();				time += amount * (12 * 60 * 60 * 1000L);				areFieldsSet = false;				break;      case HOUR:      case HOUR_OF_DAY:	if (! isTimeSet)					computeTime();				time += amount * (60 * 60 * 1000L);				areFieldsSet = false;				break;      case MINUTE:	if (! isTimeSet)					computeTime();				time += amount * (60 * 1000L);				areFieldsSet = false;				break;      case SECOND:	if (! isTimeSet)					computeTime();				time += amount * (1000L);				areFieldsSet = false;				break;      case MILLISECOND:	if (! isTimeSet)					computeTime();				time += amount;				areFieldsSet = false;				break;      case ZONE_OFFSET:      case DST_OFFSET:default:	throw new IllegalArgumentException("Invalid or unknown field");		}	}