Index: java/text/SimpleDateFormat.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/text/SimpleDateFormat.java,v retrieving revision 1.37 diff -u -r1.37 SimpleDateFormat.java --- java/text/SimpleDateFormat.java 2 Feb 2005 01:19:12 -0000 1.37 +++ java/text/SimpleDateFormat.java 5 Feb 2005 15:43:25 -0000 @@ -1096,7 +1096,10 @@ // exactly 2 digits. int digit_count = pos.getIndex() - index; if (digit_count == 2) - is2DigitYear = true; + { + is2DigitYear = true; + value += defaultCentury; + } } // Assign the value and move on. @@ -1107,8 +1110,7 @@ { // Apply the 80-20 heuristic to dermine the full year based on // defaultCenturyStart. - int year = defaultCentury + calendar.get(Calendar.YEAR); - calendar.set(Calendar.YEAR, year); + int year = calendar.get(Calendar.YEAR); if (calendar.getTime().compareTo(defaultCenturyStart) < 0) calendar.set(Calendar.YEAR, year + 100); } Index: java/util/Calendar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/Calendar.java,v retrieving revision 1.35 diff -u -r1.35 Calendar.java --- java/util/Calendar.java 2 Feb 2005 11:46:26 -0000 1.35 +++ java/util/Calendar.java 5 Feb 2005 15:43:25 -0000 @@ -683,7 +683,7 @@ fields[field] = value; isSet[field] = true; - // The five valid date patterns, in order of validity + // The five valid date patterns, in order of priority // 1 YEAR + MONTH + DAY_OF_MONTH // 2 YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK // 3 YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK @@ -827,23 +827,21 @@ { isTimeSet = false; areFieldsSet = false; + int zoneOffs = zone.getRawOffset(); - int hour = fields[ZONE_OFFSET] / (60 * 60 * 1000); - int minute = (fields[ZONE_OFFSET] - 60 * 60 * 1000 * hour) / (60 * 1000); - int seconds = (fields[ZONE_OFFSET] - 60 * 60 * 1000 * hour - - 60 * 1000 * minute) / 1000; - int millis = fields[ZONE_OFFSET] - 60 * 60 * 1000 * hour - - 60 * 1000 * minute - seconds * 1000; + int hour = zoneOffs / (60 * 60 * 1000); + int minute = (zoneOffs - 60 * 60 * 1000 * hour) / (60 * 1000); + int seconds = (zoneOffs - 60 * 60 * 1000 * hour - 60 * 1000 * minute) / 1000; + int millis = zoneOffs - 60 * 60 * 1000 * hour - 60 * 1000 * minute + - seconds * 1000; int[] tempFields = { 1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, hour, - hour, minute, seconds, millis, fields[ZONE_OFFSET], - fields[DST_OFFSET] + hour, minute, seconds, millis, zoneOffs, 0 }; fields = tempFields; - for (int i = 0; i < FIELD_COUNT - 2; i++) + for (int i = 0; i < FIELD_COUNT; i++) isSet[i] = false; - isSet[ZONE_OFFSET] = isSet[DST_OFFSET] = true; } /** @@ -855,10 +853,15 @@ */ public final void clear(int field) { + int[] tempFields = + { + 1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, 0, 0, 0, + 0, 0, zone.getRawOffset(), 0 + }; isTimeSet = false; areFieldsSet = false; isSet[field] = false; - fields[field] = 0; + fields[field] = tempFields[field]; } /** Index: java/util/GregorianCalendar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/GregorianCalendar.java,v retrieving revision 1.36 diff -u -r1.36 GregorianCalendar.java --- java/util/GregorianCalendar.java 1 Feb 2005 16:08:17 -0000 1.36 +++ java/util/GregorianCalendar.java 5 Feb 2005 15:43:25 -0000 @@ -562,18 +562,18 @@ // rest of code assumes day/month/year set // should negative BC years be AD? // get the hour (but no check for validity) - if (isSet[HOUR_OF_DAY]) - hour = fields[HOUR_OF_DAY]; - else if (isSet[HOUR]) + if (isSet[HOUR]) { hour = fields[HOUR]; - if (isSet[AM_PM] && fields[AM_PM] == PM) + if (fields[AM_PM] == PM) if (hour != 12) /* not Noon */ hour += 12; /* Fix the problem of the status of 12:00 AM (midnight). */ - if (isSet[AM_PM] && fields[AM_PM] == AM && hour == 12) + if (fields[AM_PM] == AM && hour == 12) hour = 0; } + else + hour = fields[HOUR_OF_DAY]; // Read the era,year,month,day fields and convert as appropriate. // Calculate number of milliseconds into the day @@ -644,12 +644,20 @@ weekday += 7; fields[DAY_OF_WEEK] = weekday; + // Time zone corrections. TimeZone zone = getTimeZone(); - int rawOffset = zone.getRawOffset(); - int dstOffset = zone.getOffset((year < 1) ? BC : AD, - (year < 1) ? 1 - year : year, month, day, - weekday, millisInDay) - zone.getRawOffset(); - time -= (rawOffset + dstOffset); + int rawOffset = isSet[ZONE_OFFSET] ? fields[ZONE_OFFSET] + : zone.getRawOffset(); + + int dstOffset = isSet[DST_OFFSET] ? fields[DST_OFFSET] + : (zone.getOffset((year < 0) ? BC : AD, + (year < 0) ? 1 - year + : year, + month, day, weekday, + millisInDay) + - zone.getRawOffset()); + + time -= rawOffset + dstOffset; isTimeSet = true; } @@ -1101,7 +1109,7 @@ private static final int[] minimums = { BC, 1, 0, 0, 1, 1, 1, SUNDAY, 1, AM, - 1, 0, 1, 1, 1, -(12 * 60 * 60 * 1000), + 1, 0, 0, 0, 0, -(12 * 60 * 60 * 1000), 0 };