From 0ba09d8fc65f306909c11b68c67030a3c6ca13c2 Mon Sep 17 00:00:00 2001 From: Bryce McKinlay Date: Sun, 10 Oct 2004 16:19:37 +0000 Subject: [PATCH] Calendar.java (set): Invalidate DST_OFFSET field as a DST boundary may have been crossed. 2004-10-08 Bryce McKinlay * java/util/Calendar.java (set): Invalidate DST_OFFSET field as a DST boundary may have been crossed. * java/util/GregorianCalendar.java (add): Throw IllegalArgumentException on attempt to add to DST_OFFSET or ZONE_OFFSET fields. Update javadoc. From-SVN: r88847 --- libjava/ChangeLog | 8 ++++++++ libjava/java/util/Calendar.java | 6 ++++++ libjava/java/util/GregorianCalendar.java | 17 ++++++----------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 856ac3ae5ec..f46c2830660 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2004-10-08 Bryce McKinlay + + * java/util/Calendar.java (set): Invalidate DST_OFFSET + field as a DST boundary may have been crossed. + * java/util/GregorianCalendar.java (add): Throw + IllegalArgumentException on attempt to add to DST_OFFSET or + ZONE_OFFSET fields. Update javadoc. + 2004-10-09 Michael Koch * java/io/CharArrayWriter.java diff --git a/libjava/java/util/Calendar.java b/libjava/java/util/Calendar.java index 05d48c2753c..6e9eda92a73 100644 --- a/libjava/java/util/Calendar.java +++ b/libjava/java/util/Calendar.java @@ -651,6 +651,10 @@ public abstract class Calendar implements Serializable, Cloneable isSet[HOUR_OF_DAY] = false; break; } + + // May have crossed over a DST boundary. + if (field != DST_OFFSET && field != ZONE_OFFSET) + isSet[DST_OFFSET] = false; } /** @@ -671,6 +675,8 @@ public abstract class Calendar implements Serializable, Cloneable isSet[WEEK_OF_MONTH] = false; isSet[DAY_OF_WEEK] = false; isSet[DAY_OF_WEEK_IN_MONTH] = false; + + isSet[DST_OFFSET] = false; // May have crossed a DST boundary. } /** diff --git a/libjava/java/util/GregorianCalendar.java b/libjava/java/util/GregorianCalendar.java index fcef6bb4560..2504f603427 100644 --- a/libjava/java/util/GregorianCalendar.java +++ b/libjava/java/util/GregorianCalendar.java @@ -540,7 +540,7 @@ public class GregorianCalendar extends Calendar fields[DAY_OF_WEEK] = weekday; // get a first approximation of the year. This may be one - // year to big. + // year too big. int year = 1970 + (gregorian ? ((day - 100) * 400) / (365 * 400 + 100 - 4 + 1) : ((day - 100) * 4) / (365 * 4 + 1)); @@ -709,6 +709,10 @@ public class GregorianCalendar extends Calendar * it does what you expect: Jan, 25 + 10 Days is Feb, 4. * @param field the time field. One of the time field constants. * @param amount the amount of time. + * @exception IllegalArgumentException if field is + * ZONE_OFFSET, DST_OFFSET, or invalid; or + * if amount contains an out-of-range value and the calendar + * is not in lenient mode. */ public void add(int field, int amount) { @@ -785,18 +789,9 @@ public class GregorianCalendar extends Calendar areFieldsSet = false; break; case ZONE_OFFSET: - complete(); - fields[ZONE_OFFSET] += amount; - time -= amount; - break; case DST_OFFSET: - complete(); - fields[DST_OFFSET] += amount; - isTimeSet = false; - break; default: - throw new IllegalArgumentException - ("Unknown Calendar field: " + field); + throw new IllegalArgumentException("Invalid or unknown field"); } }