SimpleTimeZone.java (startTimeMode, [...]): New members.
authorJerry Quinn <jlquinn@optonline.net>
Fri, 7 May 2004 04:57:57 +0000 (04:57 +0000)
committerJerry Quinn <jlquinn@gcc.gnu.org>
Fri, 7 May 2004 04:57:57 +0000 (04:57 +0000)
2004-05-07  Jerry Quinn  <jlquinn@optonline.net>

* java/util/SimpleTimeZone.java (startTimeMode, endTimeMode,
        WALL_TIME, STANDARD_TIME, UTC_TIME): New members.
(SimpleTimeZone): Tweak docs.  Add new variation.
(setStartRule,setEndRule): Add new variations.  Use
        startTimeMode and endTimeMode.

From-SVN: r81605

libjava/ChangeLog
libjava/java/util/SimpleTimeZone.java

index e286911f3abc964b36355bb0908ea65d600eec3e..ceaaa7b49c811a785f8bd548120824d726619a8f 100644 (file)
@@ -1,3 +1,16 @@
+2004-05-07  Jerry Quinn  <jlquinn@optonline.net>
+
+       * java/util/SimpleTimeZone.java (startTimeMode, endTimeMode,
+        WALL_TIME, STANDARD_TIME, UTC_TIME): New members.
+       (SimpleTimeZone): Tweak docs.  Add new variation.
+       (setStartRule,setEndRule): Add new variations.  Use
+        startTimeMode and endTimeMode.
+
+2004-05-07  Jerry Quinn  <jlquinn@optonline.net>
+
+       * java/util/Calendar.java (getActualMinimum,
+        getActualMaximum):  Remove abstract.  Implement.
+
 2004-05-06  Bryce McKinlay  <mckinlay@redhat.com>
 
        Run the jni tests using the interpreter.
index 31b85e189725c620af9ffab51413085f0f5f0989..71f92e88f34a81b80d0370723d441ef85175f936 100644 (file)
@@ -1,5 +1,5 @@
 /* java.util.SimpleTimeZone
-   Copyright (C) 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -146,7 +146,15 @@ public class SimpleTimeZone extends TimeZone
    * @serial
    */
   private int startTime;
-   
+
+  /**
+   * This variable specifies the mode that startTime is specified in.  By
+   * default it is WALL_TIME, but can also be STANDARD_TIME or UTC_TIME.  For
+   * startTime, STANDARD_TIME and WALL_TIME are equivalent.
+   * @serial
+   */
+  private int startTimeMode = WALL_TIME;
+
   /**
    * The month in which daylight savings ends.  This is one of the
    * constants Calendar.JANUARY, ..., Calendar.DECEMBER.  
@@ -185,6 +193,13 @@ public class SimpleTimeZone extends TimeZone
    */
   private int endTime;
 
+  /**
+   * This variable specifies the mode that endTime is specified in.  By
+   * default it is WALL_TIME, but can also be STANDARD_TIME or UTC_TIME.
+   * @serial
+   */
+  private int endTimeMode = WALL_TIME;
+
   /**
    * This variable points to a deprecated array from JDK 1.1.  It is
    * ignored in JDK 1.2 but streamed out for compatibility with JDK 1.1.
@@ -223,6 +238,23 @@ public class SimpleTimeZone extends TimeZone
 
   private static final long serialVersionUID = -403250971215465050L;
 
+  /**
+   * Constant to indicate that start and end times are specified in standard
+   * time, without adjusting for daylight savings.
+   */
+  public static final int STANDARD_TIME = 1;
+
+  /**
+   * Constant to indicate that start and end times are specified in wall
+   * time, adjusting for daylight savings.  This is the default.
+   */
+  public static final int WALL_TIME = 0;
+
+  /**
+   * Constant to indicate that start and end times are specified in UTC.
+   */
+  public static final int UTC_TIME = 2;
+
   /**
    * Create a <code>SimpleTimeZone</code> with the given time offset
    * from GMT and without daylight savings.  
@@ -283,7 +315,10 @@ public class SimpleTimeZone extends TimeZone
    * @param endday A day in month or a day of week number, as 
    * described above.
    * @param endDayOfWeek The end rule day of week; see above.
-   * @param endTime A time in millis in standard time.  */
+   * @param endTime A time in millis in standard time.
+   * @throws IllegalArgumentException if parameters are invalid or out of
+   * range.
+   */
   public SimpleTimeZone(int rawOffset, String id,
                        int startMonth, int startDayOfWeekInMonth,
                        int startDayOfWeek, int startTime,
@@ -310,6 +345,7 @@ public class SimpleTimeZone extends TimeZone
    *
    * @param dstSavings the amount of savings for daylight savings
    * time in milliseconds.  This must be positive.
+   * @since 1.2
    */
   public SimpleTimeZone(int rawOffset, String id,
                        int startMonth, int startDayOfWeekInMonth,
@@ -324,6 +360,51 @@ public class SimpleTimeZone extends TimeZone
     this.dstSavings = dstSavings;
   }
 
+  /**
+   * This constructs a new SimpleTimeZone that supports a daylight savings
+   * rule.  The parameter are the same as for the constructor above, except
+   * there are the additional startTimeMode, endTimeMode, and dstSavings
+   * parameters.
+   *
+   * @param startTimeMode the mode that start times are specified in.  One of
+   * WALL_TIME, STANDARD_TIME, or UTC_TIME.
+   * @param endTimeMode the mode that end times are specified in.  One of
+   * WALL_TIME, STANDARD_TIME, or UTC_TIME.
+   * @param dstSavings the amount of savings for daylight savings
+   * time in milliseconds.  This must be positive.
+   * @throws IllegalArgumentException if parameters are invalid or out of
+   * range.
+   * @since 1.4
+   */
+  public SimpleTimeZone(int rawOffset, String id,
+                       int startMonth, int startDayOfWeekInMonth,
+                       int startDayOfWeek, int startTime, int startTimeMode,
+                       int endMonth, int endDayOfWeekInMonth,
+                       int endDayOfWeek, int endTime, int endTimeMode,
+                       int dstSavings)
+  {
+    this.rawOffset = rawOffset;
+    setID(id);
+    useDaylight = true;
+
+    if (startTimeMode < WALL_TIME || startTimeMode > UTC_TIME)
+      throw new IllegalArgumentException("startTimeMode must be one of WALL_TIME, STANDARD_TIME, or UTC_TIME");
+    if (endTimeMode < WALL_TIME || endTimeMode > UTC_TIME)
+      throw new IllegalArgumentException("endTimeMode must be one of WALL_TIME, STANDARD_TIME, or UTC_TIME");
+    this.startTimeMode = startTimeMode;
+    this.endTimeMode = endTimeMode;
+
+    setStartRule(startMonth, startDayOfWeekInMonth,
+                startDayOfWeek, startTime);
+    setEndRule(endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
+    if (startMonth == endMonth)
+      throw new IllegalArgumentException
+       ("startMonth and endMonth must be different");
+    this.startYear = 0;
+
+    this.dstSavings = dstSavings;
+  }
+
   /**
    * Sets the first year, where daylight savings applies.  The daylight
    * savings rule never apply for years in the BC era.  Note that this
@@ -400,18 +481,85 @@ public class SimpleTimeZone extends TimeZone
     // of this method.
     this.startDay = Math.abs(day);
     this.startDayOfWeek = Math.abs(dayOfWeek);
-    this.startTime = time;
+    if (this.startTimeMode == WALL_TIME || this.startTimeMode == STANDARD_TIME)
+      this.startTime = time;
+    else
+      // Convert from UTC to STANDARD
+      this.startTime = time + this.rawOffset;
+    useDaylight = true;
+  }
+
+  /**
+   * Sets the daylight savings start rule.  You must also set the
+   * end rule with <code>setEndRule</code> or the result of
+   * getOffset is undefined.  For the parameters see the ten-argument
+   * constructor above.
+   *
+   * Note that this API isn't incredibly well specified.  It appears that the
+   * after flag must override the parameters, since normally, the day and
+   * dayofweek can select this.  I.e., if day < 0 and dayOfWeek < 0, on or
+   * before mode is chosen.  But if after == true, this implementation
+   * overrides the signs of the other arguments.  And if dayOfWeek == 0, it
+   * falls back to the behavior in the other APIs.  I guess this should be
+   * checked against Sun's implementation.
+   *
+   * @param month The month where daylight savings start, zero
+   * based.  You should use the constants in Calendar.
+   * @param day A day of month or day of week in month.
+   * @param dayOfWeek The day of week where daylight savings start.
+   * @param time The time in milliseconds standard time where daylight
+   * savings start.
+   * @param after If true, day and dayOfWeek specify first day of week on or
+   * after day, else first day of week on or before.
+   * @since 1.2
+   * @see SimpleTimeZone
+   */
+  public void setStartRule(int month, int day, int dayOfWeek, int time, boolean after)
+  {
+    // FIXME: XXX: Validate that checkRule and offset processing work with on
+    // or before mode.
+    this.startDay = after ? Math.abs(day) : -Math.abs(day);
+    this.startDayOfWeek = after ? Math.abs(dayOfWeek) : -Math.abs(dayOfWeek);
+    this.startMode = (dayOfWeek != 0) ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
+      : checkRule(month, day, dayOfWeek);
+    this.startDay = Math.abs(this.startDay);
+    this.startDayOfWeek = Math.abs(this.startDayOfWeek);
+
+    this.startMonth = month;
+
+    if (this.startTimeMode == WALL_TIME || this.startTimeMode == STANDARD_TIME)
+      this.startTime = time;
+    else
+      // Convert from UTC to STANDARD
+      this.startTime = time + this.rawOffset;
     useDaylight = true;
   }
 
+  /**
+   * Sets the daylight savings start rule.  You must also set the
+   * end rule with <code>setEndRule</code> or the result of
+   * getOffset is undefined.  For the parameters see the ten-argument
+   * constructor above.
+   *
+   * @param month The month where daylight savings start, zero
+   * based.  You should use the constants in Calendar.
+   * @param day A day of month or day of week in month.
+   * @param time The time in milliseconds standard time where daylight
+   * savings start.
+   * @see SimpleTimeZone
+   * @since 1.2
+   */
+  public void setStartRule(int month, int day, int time)
+  {
+    setStartRule(month, day, 0, time);
+  }
+
   /**
    * Sets the daylight savings end rule.  You must also set the
    * start rule with <code>setStartRule</code> or the result of
    * getOffset is undefined. For the parameters see the ten-argument
    * constructor above.
    *
-   * @param rawOffset The time offset from GMT.
-   * @param id  The identifier of this time zone.
    * @param month The end month of daylight savings.
    * @param day A day in month, or a day of week in month.
    * @param dayOfWeek A day of week, when daylight savings ends.
@@ -426,10 +574,81 @@ public class SimpleTimeZone extends TimeZone
     // of this method.
     this.endDay = Math.abs(day);
     this.endDayOfWeek = Math.abs(dayOfWeek);
-    this.endTime = time;
+    if (this.endTimeMode == WALL_TIME)
+      this.endTime = time;
+    else if (this.endTimeMode == STANDARD_TIME)
+      // Convert from STANDARD to DST
+      this.endTime = time + this.dstSavings;
+    else
+      // Convert from UTC to DST
+      this.endTime = time + this.rawOffset + this.dstSavings;
+    useDaylight = true;
+  }
+
+  /**
+   * Sets the daylight savings end rule.  You must also set the
+   * start rule with <code>setStartRule</code> or the result of
+   * getOffset is undefined. For the parameters see the ten-argument
+   * constructor above.
+   *
+   * Note that this API isn't incredibly well specified.  It appears that the
+   * after flag must override the parameters, since normally, the day and
+   * dayofweek can select this.  I.e., if day < 0 and dayOfWeek < 0, on or
+   * before mode is chosen.  But if after == true, this implementation
+   * overrides the signs of the other arguments.  And if dayOfWeek == 0, it
+   * falls back to the behavior in the other APIs.  I guess this should be
+   * checked against Sun's implementation.
+   *
+   * @param month The end month of daylight savings.
+   * @param day A day in month, or a day of week in month.
+   * @param dayOfWeek A day of week, when daylight savings ends.
+   * @param time A time in millis in standard time.
+   * @param after If true, day and dayOfWeek specify first day of week on or
+   * after day, else first day of week on or before.
+   * @since 1.2
+   * @see #setStartRule
+   */
+  public void setEndRule(int month, int day, int dayOfWeek, int time, boolean after)
+  {
+    // FIXME: XXX: Validate that checkRule and offset processing work with on
+    // or before mode.
+    this.endDay = after ? Math.abs(day) : -Math.abs(day);
+    this.endDayOfWeek = after ? Math.abs(dayOfWeek) : -Math.abs(dayOfWeek);
+    this.endMode = (dayOfWeek != 0) ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
+      : checkRule(month, day, dayOfWeek);
+    this.endDay = Math.abs(this.endDay);
+    this.endDayOfWeek = Math.abs(endDayOfWeek);
+
+    this.endMonth = month;
+
+    if (this.endTimeMode == WALL_TIME)
+      this.endTime = time;
+    else if (this.endTimeMode == STANDARD_TIME)
+      // Convert from STANDARD to DST
+      this.endTime = time + this.dstSavings;
+    else
+      // Convert from UTC to DST
+      this.endTime = time + this.rawOffset + this.dstSavings;
     useDaylight = true;
   }
 
+  /**
+   * Sets the daylight savings end rule.  You must also set the
+   * start rule with <code>setStartRule</code> or the result of
+   * getOffset is undefined. For the parameters see the ten-argument
+   * constructor above.
+   *
+   * @param month The end month of daylight savings.
+   * @param day A day in month, or a day of week in month.
+   * @param dayOfWeek A day of week, when daylight savings ends.
+   * @param time A time in millis in standard time.
+   * @see #setStartRule
+   */
+  public void setEndRule(int month, int day, int time)
+  {
+    setEndRule(month, day, 0, time);
+  }
+
   /**
    * Gets the time zone offset, for current date, modified in case of 
    * daylight savings.  This is the offset to add to UTC to get the local