This, together with the other recent patches should wrap up nearly all
mauve failures for Calendar/GregorianCalendar.

/Sven

2005-03-09  Sven de Marothy  <[EMAIL PROTECTED]>

        * java/util/Calendar.java
        (set): Use starting day of week when one is needed if none is given.
        * java/text/SimpleDateFormat.java
        (parse): Handle 1-12 and 1-24 timestamps correctly.
        * java/util/GregorianCalendar
        (computeTime, computeFields): HOUR should be in 0-11 format.
        (nonLeniencyCheck): Adjust leniency checking to that fact.

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);
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to