Index: java/text/SimpleDateFormat.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/text/SimpleDateFormat.java,v retrieving revision 1.43 diff -u -r1.43 SimpleDateFormat.java --- java/text/SimpleDateFormat.java 23 Feb 2005 01:29:13 -0000 1.43 +++ java/text/SimpleDateFormat.java 9 Mar 2005 22:23:38 -0000 @@ -916,6 +916,8 @@ boolean is_numeric = true; int offset = 0; boolean maybe2DigitYear = false; + boolean oneBasedHour = false; + boolean oneBasedHourOfDay = false; Integer simpleOffset; String[] set1 = null; String[] set2 = null; @@ -964,12 +966,14 @@ break; case 'h': calendar_field = Calendar.HOUR; + oneBasedHour = true; break; case 'H': calendar_field = Calendar.HOUR_OF_DAY; break; case 'k': calendar_field = Calendar.HOUR_OF_DAY; + oneBasedHourOfDay = true; break; case 'm': calendar_field = Calendar.MINUTE; @@ -1108,6 +1112,14 @@ } } + // Calendar uses 0-based hours. + // I.e. 00:00 AM is midnight, not 12 AM or 24:00 + if (oneBasedHour && value == 12) + value = 0; + + if (oneBasedHourOfDay && value == 24) + value = 0; + // Assign the value and move on. calendar.set(calendar_field, value); } Index: java/util/Calendar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/Calendar.java,v retrieving revision 1.40 diff -u -r1.40 Calendar.java --- java/util/Calendar.java 9 Mar 2005 22:05:27 -0000 1.40 +++ java/util/Calendar.java 9 Mar 2005 22:23:38 -0000 @@ -723,6 +723,8 @@ isSet[WEEK_OF_YEAR] = false; break; case WEEK_OF_MONTH: // pattern 2 + if (! isSet[DAY_OF_WEEK]) + fields[DAY_OF_WEEK] = getFirstDayOfWeek(); isSet[YEAR] = true; isSet[MONTH] = true; isSet[DAY_OF_WEEK] = true; @@ -732,6 +734,8 @@ isSet[WEEK_OF_YEAR] = false; break; case DAY_OF_WEEK_IN_MONTH: // pattern 3 + if (! isSet[DAY_OF_WEEK]) + fields[DAY_OF_WEEK] = getFirstDayOfWeek(); isSet[YEAR] = true; isSet[MONTH] = true; isSet[DAY_OF_WEEK] = true; @@ -750,6 +754,8 @@ isSet[DAY_OF_WEEK_IN_MONTH] = false; break; case WEEK_OF_YEAR: // pattern 5 + if (! isSet[DAY_OF_WEEK]) + fields[DAY_OF_WEEK] = getFirstDayOfWeek(); isSet[YEAR] = true; isSet[DAY_OF_WEEK] = true; isSet[MONTH] = false; Index: java/util/GregorianCalendar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/GregorianCalendar.java,v retrieving revision 1.40 diff -u -r1.40 GregorianCalendar.java --- java/util/GregorianCalendar.java 9 Mar 2005 22:05:27 -0000 1.40 +++ java/util/GregorianCalendar.java 9 Mar 2005 22:23:38 -0000 @@ -474,7 +474,7 @@ if (isSet[AM_PM] && fields[AM_PM] != AM && fields[AM_PM] != PM) throw new IllegalArgumentException("Illegal AM_PM."); - if (isSet[HOUR] && (fields[HOUR] < 0 || fields[HOUR] > 12)) + if (isSet[HOUR] && (fields[HOUR] < 0 || fields[HOUR] > 11)) throw new IllegalArgumentException("Illegal HOUR."); if (isSet[HOUR_OF_DAY] && (fields[HOUR_OF_DAY] < 0 || fields[HOUR_OF_DAY] > 23)) @@ -560,10 +560,18 @@ // 3: YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK if (isSet[DAY_OF_WEEK_IN_MONTH]) { + if (fields[DAY_OF_WEEK_IN_MONTH] < 0) + { + month++; + first = getFirstDayOfMonth(year, month); + day = 1 + 7 * (fields[DAY_OF_WEEK_IN_MONTH]); + } + else + day = 1 + 7 * (fields[DAY_OF_WEEK_IN_MONTH] - 1); + int offs = fields[DAY_OF_WEEK] - first; if (offs < 0) offs += 7; - day = 1 + 7 * (fields[DAY_OF_WEEK_IN_MONTH] - 1); day += offs; } else @@ -580,7 +588,7 @@ day = offs + 7 * (fields[WEEK_OF_MONTH] - 1); offs = fields[DAY_OF_WEEK] - getFirstDayOfWeek(); - if (offs < 0) + if (offs <= 0) offs += 7; day += offs; } @@ -598,11 +606,7 @@ { hour = fields[HOUR]; if (fields[AM_PM] == PM) - if (hour != 12) /* not Noon */ - hour += 12; - /* Fix the problem of the status of 12:00 AM (midnight). */ - if (fields[AM_PM] == AM && hour == 12) - hour = 0; + hour += 12; } else hour = fields[HOUR_OF_DAY]; @@ -854,7 +858,7 @@ int hourOfDay = millisInDay / (60 * 60 * 1000); fields[AM_PM] = (hourOfDay < 12) ? AM : PM; int hour = hourOfDay % 12; - fields[HOUR] = (hour == 0) ? 12 : hour; + fields[HOUR] = hour; fields[HOUR_OF_DAY] = hourOfDay; millisInDay %= (60 * 60 * 1000); fields[MINUTE] = millisInDay / (60 * 1000);