aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/SimpleTimeZone.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/SimpleTimeZone.java')
-rw-r--r--libjava/java/util/SimpleTimeZone.java182
1 files changed, 182 insertions, 0 deletions
diff --git a/libjava/java/util/SimpleTimeZone.java b/libjava/java/util/SimpleTimeZone.java
new file mode 100644
index 0000000..6082b18
--- /dev/null
+++ b/libjava/java/util/SimpleTimeZone.java
@@ -0,0 +1,182 @@
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date October 24, 1998.
+ */
+
+/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3.
+ * Status: Does not know how to figure out if daylight savings time
+ * is in effect; hence only correct for zones without DST.
+ * No known spec for hashCode.
+ */
+
+public class SimpleTimeZone extends TimeZone
+{
+ // The fields are as specified in Sun's "Serialized Form"
+ // in the JDK 1.2 beta 4 API specification.
+
+ int dstSavings = 60 * 60 * 1000;
+
+ int rawOffset;
+
+ // int serialVersionOnStream;
+
+ int startDay;
+ int startDayOfWeek;
+ int startMode; /// Seems to be JDK 1.2 only.
+
+ int startMonth;
+
+ int startTime;
+
+ int startYear;
+
+ int endDay;
+
+ int endDayOfWeek;
+
+ int endMode; // Seems to be JDK 1.2 only.
+
+ int endMonth;
+
+ int endTime;
+
+ // byte[] monthLength;
+
+ boolean useDaylight;
+
+ public SimpleTimeZone (int rawOffset, String ID)
+ {
+ setID(ID);
+ this.rawOffset = rawOffset;
+ }
+
+ public SimpleTimeZone (int rawOffset, String ID,
+ int startMonth, int startDay,
+ int startDayOfWeek, int startTime,
+ int endMonth, int endDay,
+ int endDayOfWeek, int endTime)
+ {
+ this(rawOffset, ID);
+ setStartRule (startMonth, startDay, startDayOfWeek, startTime);
+ setEndRule (endMonth, endDay, endDayOfWeek, endTime);
+ }
+
+ public int getRawOffset() { return rawOffset; }
+ public void setRawOffset (int offsetMillis) { rawOffset = offsetMillis; }
+
+ public int getOffset (int era, int year, int month, int day,
+ int dayOfWeek, int millis)
+ {
+ int offset = getRawOffset();
+ if (useDaylight)
+ {
+ if (startYear != 0
+ && (year < startYear || era == GregorianCalendar.BC))
+ return offset;
+ boolean midYearSummer = startMonth < endMonth;
+ if (midYearSummer ? (month < startMonth || month > endMonth)
+ : (month < startMonth && month > endMonth))
+ return offset; // Definitely not DST.
+ if (midYearSummer ? (month > startMonth && month < endMonth)
+ : (month > startMonth || month < endMonth))
+ return offset + dstSavings; // Definitely DST.
+ // Now it gets more complicated. Bail for now.
+ throw new Error("not implemented - SimpleTimeZone.getOffset");
+ }
+ return offset;
+ }
+
+ public boolean useDaylightTime() { return useDaylight; }
+
+ public boolean inDaylightTime(Date date)
+ {
+ if (! useDaylight)
+ return false;
+ throw new Error("not implemented - SimpleTimeZone.inDaylightTime");
+ }
+
+ public int getDSTSavings () { return dstSavings; }
+
+ public void setDSTSavings (int millisSavedDuringDST)
+ { dstSavings = millisSavedDuringDST; }
+
+ public void setStartRule (int month, int dayOfWeekInMonth,
+ int dayOfWeek, int time)
+ {
+ this.startMonth = month;
+ this.startDay = dayOfWeekInMonth;
+ this.startDayOfWeek = dayOfWeek;
+ this.startTime = time;
+ this.useDaylight = true;
+ }
+
+ public void setEndRule (int month, int dayOfWeekInMonth,
+ int dayOfWeek, int time)
+ {
+ this.endMonth = month;
+ this.endDay = dayOfWeekInMonth;
+ this.endDayOfWeek = dayOfWeek;
+ this.endTime = time;
+ this.useDaylight = true;
+ }
+
+ public void setStartYear (int year)
+ {
+ this.startYear = startYear;
+ }
+
+ public boolean hasSameRules (TimeZone other)
+ {
+ if (this == other)
+ return true;
+ if (! (other instanceof SimpleTimeZone))
+ return false;
+ SimpleTimeZone o = (SimpleTimeZone) other;
+ if (rawOffset != o.rawOffset)
+ return false;
+ if (useDaylight != o.useDaylight)
+ return false;
+ if (! useDaylight)
+ return true;
+ return startDay == o.startDay
+ && startDayOfWeek == o.startDayOfWeek
+ && startMonth == o.startMonth
+ && startTime == o.startTime
+ && endDay == o.endDay
+ && endDayOfWeek == o.endDayOfWeek
+ && endMonth == o.endMonth
+ && endTime == o.endTime
+ && startYear == o.startYear
+ && startMode == o.startMode
+ && endMode == o.endMode;
+ }
+
+ public boolean equals (Object obj)
+ {
+ if (! (obj instanceof SimpleTimeZone))
+ return false;
+ SimpleTimeZone other = (SimpleTimeZone) obj;
+ return getID() == other.getID() && hasSameRules(other);
+ }
+
+ public int hashCode ()
+ {
+ // FIXME - this does not folow any spec (since none is public)!
+ int hash = rawOffset;
+ if (useDaylight)
+ hash += dstSavings + startYear + startMode + endMode
+ + startDay + startDayOfWeek + startMonth + startTime
+ + endDay + endDayOfWeek + endMonth + endTime;
+ return hash;
+ }
+}