SimpleDateFormat.java (parse): Handle non-dst time zones.
authorTom Tromey <tromey@redhat.com>
Wed, 16 May 2001 15:34:46 +0000 (15:34 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 16 May 2001 15:34:46 +0000 (15:34 +0000)
* java/text/SimpleDateFormat.java (parse): Handle non-dst time
zones.

From-SVN: r42156

libjava/ChangeLog
libjava/java/text/SimpleDateFormat.java

index e64825a308532e6c2d97da35da8de402aad1ad5f..4bb315f44be4825dfa5fd7233be40cacf30bf071 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-16  Tom Tromey  <tromey@redhat.com>
+
+       * java/text/SimpleDateFormat.java (parse): Handle non-dst time
+       zones.
+
 2001-05-15  Tom Tromey  <tromey@redhat.com>
 
        * java/util/GregorianCalendar.java (computeTime): Only call
index 5b366389c5dce591be96180bfe77ded4aa4213b9..80ab6ea73095de1529eaae75e3c338fbb0950a90 100644 (file)
@@ -518,6 +518,7 @@ public class SimpleDateFormat extends DateFormat
     // then this.equals() will no longer have the desired result.
     Calendar theCalendar = (Calendar) calendar.clone ();
     theCalendar.clear();
+    boolean saw_timezone = false;
     int quote_start = -1;
     for (; fmt_index < fmt_max; ++fmt_index)
       {
@@ -635,7 +636,6 @@ public class SimpleDateFormat extends DateFormat
            // We need a special case for the timezone, because it
            // uses a different data structure than the other cases.
            is_numeric = false;
-           // We don't actually use this; see below.
            calendar_field = Calendar.DST_OFFSET;
            String[][] zoneStrings = formatData.getZoneStrings();
            int zoneCount = zoneStrings.length;
@@ -653,8 +653,16 @@ public class SimpleDateFormat extends DateFormat
                if (k != strings.length)
                  {
                    found_zone = true;
+                   saw_timezone = true;
                    TimeZone tz = TimeZone.getTimeZone (strings[0]);
                    theCalendar.setTimeZone (tz);
+                   theCalendar.set (Calendar.ZONE_OFFSET, tz.getRawOffset ());
+                   offset = 0;
+                   if (k > 2 && tz instanceof SimpleTimeZone)
+                     {
+                       SimpleTimeZone stz = (SimpleTimeZone) tz;
+                       offset = stz.getDSTSavings ();
+                     }
                    pos.setIndex(index + strings[k].length());
                    break;
                  }
@@ -698,19 +706,21 @@ public class SimpleDateFormat extends DateFormat
            value = i;
          }
        else
-         value = 0;
+         value = offset;
 
        // Assign the value and move on.
-       if (calendar_field != Calendar.DST_OFFSET)
-         theCalendar.set(calendar_field, value);
+       theCalendar.set(calendar_field, value);
       }
 
     try
       {
-       // Clear calendar fields here to force getTime() to correctly
-       // respect DST in the timezone.
-       theCalendar.clear (Calendar.DST_OFFSET);
-       theCalendar.clear (Calendar.ZONE_OFFSET);
+       if (! saw_timezone)
+         {
+           // Use the real rules to determine whether or not this
+           // particular time is in daylight savings.
+           theCalendar.clear (Calendar.DST_OFFSET);
+           theCalendar.clear (Calendar.ZONE_OFFSET);
+         }
         return theCalendar.getTime();
       }
     catch (IllegalArgumentException x)