/* 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 * @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; } }