PatchSet 5979 
Date: 2005/02/05 20:36:22
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Sven's fix for date format/calendar problem

2005-02-05  Sven de Marothy  <[EMAIL PROTECTED]>

        * java/text/SimpleDateFormat.java
        (parse): Tweak handling of 2-year dates
        * java/util/Calendar.java
        (clear): Clear fields to correct value.
        * java/util/GregorianCalendar.java
        (computeTime): Correct handling of time zones.
        Correct field minimum values.

Members: 
        ChangeLog:1.3517->1.3518 
        libraries/javalib/java/text/SimpleDateFormat.java:1.43->1.44 
        libraries/javalib/java/util/Calendar.java:1.31->1.32 
        libraries/javalib/java/util/GregorianCalendar.java:1.34->1.35 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3517 kaffe/ChangeLog:1.3518
--- kaffe/ChangeLog:1.3517      Sat Feb  5 19:41:58 2005
+++ kaffe/ChangeLog     Sat Feb  5 20:36:22 2005
@@ -1,3 +1,13 @@
+2005-02-05  Sven de Marothy  <[EMAIL PROTECTED]>
+
+       * java/text/SimpleDateFormat.java
+       (parse): Tweak handling of 2-year dates
+       * java/util/Calendar.java
+       (clear): Clear fields to correct value.
+       * java/util/GregorianCalendar.java
+       (computeTime): Correct handling of time zones.
+       Correct field minimum values.
+
 2005-02-05  Dalibor Topic  <[EMAIL PROTECTED]>
 
        * configure.ac: Don't add PTHREAD_CFLAGS to CFLAGS.
Index: kaffe/libraries/javalib/java/text/SimpleDateFormat.java
diff -u kaffe/libraries/javalib/java/text/SimpleDateFormat.java:1.43 
kaffe/libraries/javalib/java/text/SimpleDateFormat.java:1.44
--- kaffe/libraries/javalib/java/text/SimpleDateFormat.java:1.43        Thu Feb 
 3 17:01:25 2005
+++ kaffe/libraries/javalib/java/text/SimpleDateFormat.java     Sat Feb  5 
20:36:28 2005
@@ -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: kaffe/libraries/javalib/java/util/Calendar.java
diff -u kaffe/libraries/javalib/java/util/Calendar.java:1.31 
kaffe/libraries/javalib/java/util/Calendar.java:1.32
--- kaffe/libraries/javalib/java/util/Calendar.java:1.31        Thu Feb  3 
17:01:25 2005
+++ kaffe/libraries/javalib/java/util/Calendar.java     Sat Feb  5 20:36:29 2005
@@ -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: kaffe/libraries/javalib/java/util/GregorianCalendar.java
diff -u kaffe/libraries/javalib/java/util/GregorianCalendar.java:1.34 
kaffe/libraries/javalib/java/util/GregorianCalendar.java:1.35
--- kaffe/libraries/javalib/java/util/GregorianCalendar.java:1.34       Thu Feb 
 3 17:01:25 2005
+++ kaffe/libraries/javalib/java/util/GregorianCalendar.java    Sat Feb  5 
20:36:29 2005
@@ -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
                                         };
 

_______________________________________________
kaffe mailing list
kaffe@kaffe.org
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to