home *** CD-ROM | disk | FTP | other *** search
Wrap
package java.util; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SimpleTimeZone extends TimeZone { private int startMonth; private int startDay; private int startDayOfWeek; private int startTime; private int startTimeMode; private int endMonth; private int endDay; private int endDayOfWeek; private int endTime; private int endTimeMode; private int startYear; private int rawOffset; private boolean useDaylight; private static final int millisPerHour = 3600000; private static final int millisPerDay = 86400000; private final byte[] monthLength; private static final byte[] staticMonthLength = new byte[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; private static final byte[] staticLeapMonthLength = new byte[]{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; private static GregorianCalendar internalCal = new GregorianCalendar(); private int startMode; private int endMode; private int dstSavings; private static final int DOM_MODE = 1; private static final int DOW_IN_MONTH_MODE = 2; private static final int DOW_GE_DOM_MODE = 3; private static final int DOW_LE_DOM_MODE = 4; static final int WALL_TIME = 0; static final int STANDARD_TIME = 1; static final int UTC_TIME = 2; static final long serialVersionUID = -403250971215465050L; static final int currentSerialVersion = 2; private int serialVersionOnStream; public SimpleTimeZone(int var1, String var2) { this.useDaylight = false; this.monthLength = staticMonthLength; this.serialVersionOnStream = 2; this.rawOffset = var1; ((TimeZone)this).setID(var2); this.dstSavings = 3600000; } public SimpleTimeZone(int var1, String var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { this(var1, var2, var3, var4, var5, var6, 0, var7, var8, var9, var10, 0, 3600000); } public SimpleTimeZone(int var1, String var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11) { this(var1, var2, var3, var4, var5, var6, 0, var7, var8, var9, var10, 0, var11); } SimpleTimeZone(int var1, String var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13) { this.useDaylight = false; this.monthLength = staticMonthLength; this.serialVersionOnStream = 2; ((TimeZone)this).setID(var2); this.rawOffset = var1; this.startMonth = var3; this.startDay = var4; this.startDayOfWeek = var5; this.startTime = var6; this.startTimeMode = var7; this.endMonth = var8; this.endDay = var9; this.endDayOfWeek = var10; this.endTime = var11; this.endTimeMode = var12; this.dstSavings = var13; this.decodeRules(); if (var13 <= 0) { throw new IllegalArgumentException("Illegal DST savings"); } } public void setStartYear(int var1) { this.startYear = var1; } public void setStartRule(int var1, int var2, int var3, int var4) { this.startMonth = var1; this.startDay = var2; this.startDayOfWeek = var3; this.startTime = var4; this.startTimeMode = 0; this.decodeStartRule(); } public void setStartRule(int var1, int var2, int var3) { this.setStartRule(var1, var2, 0, var3); } public void setStartRule(int var1, int var2, int var3, int var4, boolean var5) { if (var5) { this.setStartRule(var1, var2, -var3, var4); } else { this.setStartRule(var1, -var2, -var3, var4); } } public void setEndRule(int var1, int var2, int var3, int var4) { this.endMonth = var1; this.endDay = var2; this.endDayOfWeek = var3; this.endTime = var4; this.endTimeMode = 0; this.decodeEndRule(); } public void setEndRule(int var1, int var2, int var3) { this.setEndRule(var1, var2, 0, var3); } public void setEndRule(int var1, int var2, int var3, int var4, boolean var5) { if (var5) { this.setEndRule(var1, var2, -var3, var4); } else { this.setEndRule(var1, -var2, -var3, var4); } } public int getOffset(int var1, int var2, int var3, int var4, int var5, int var6) { if (var3 >= 0 && var3 <= 11) { byte var7; byte var8; if (var1 == 1 && internalCal.isLeapYear(var2)) { var7 = staticLeapMonthLength[var3]; var8 = var3 > 1 ? staticLeapMonthLength[var3 - 1] : 31; } else { var7 = staticMonthLength[var3]; var8 = var3 > 1 ? staticMonthLength[var3 - 1] : 31; } return this.getOffset(var1, var2, var3, var4, var5, var6, var7, var8); } else { throw new IllegalArgumentException("Illegal month " + var3); } } int getOffset(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { if ((var1 == 1 || var1 == 0) && var3 >= 0 && var3 <= 11 && var4 >= 1 && var4 <= var7 && var5 >= 1 && var5 <= 7 && var6 >= 0 && var6 < 86400000 && var7 >= 28 && var7 <= 31 && var8 >= 28 && var8 <= 31) { int var9 = this.rawOffset; if (this.useDaylight && var2 >= this.startYear && var1 == 1) { boolean var10 = this.startMonth > this.endMonth; int var11 = compareToRule(var3, var7, var8, var4, var5, var6, this.startTimeMode == 2 ? -this.rawOffset : 0, this.startMode, this.startMonth, this.startDayOfWeek, this.startDay, this.startTime); int var12 = 0; if (var10 != var11 >= 0) { var12 = compareToRule(var3, var7, var8, var4, var5, var6, this.endTimeMode == 0 ? this.dstSavings : (this.endTimeMode == 2 ? -this.rawOffset : 0), this.endMode, this.endMonth, this.endDayOfWeek, this.endDay, this.endTime); } if (!var10 && var11 >= 0 && var12 < 0 || var10 && (var11 >= 0 || var12 < 0)) { var9 += this.dstSavings; } return var9; } else { return var9; } } else { throw new IllegalArgumentException(); } } private static int compareToRule(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11) { var5 += var6; while(var5 >= 86400000) { var5 -= 86400000; ++var3; var4 = 1 + var4 % 7; if (var3 > var1) { var3 = 1; ++var0; } } while(var5 < 0) { var5 += 86400000; --var3; var4 = 1 + (var4 + 5) % 7; if (var3 < 1) { var3 = var2; --var0; } } if (var0 < var8) { return -1; } else if (var0 > var8) { return 1; } else { int var12 = 0; switch (var7) { case 1: var12 = var10; break; case 2: if (var10 > 0) { var12 = 1 + (var10 - 1) * 7 + (7 + var9 - (var4 - var3 + 1)) % 7; } else { var12 = var1 + (var10 + 1) * 7 - (7 + (var4 + var1 - var3) - var9) % 7; } break; case 3: var12 = var10 + (49 + var9 - var10 - var4 + var3) % 7; break; case 4: var12 = var10 - (49 - var9 + var10 + var4 - var3) % 7; } if (var3 < var12) { return -1; } else if (var3 > var12) { return 1; } else if (var5 < var11) { return -1; } else if (var5 > var11) { return 1; } else { return 0; } } } public int getRawOffset() { return this.rawOffset; } public void setRawOffset(int var1) { this.rawOffset = var1; } public void setDSTSavings(int var1) { if (var1 <= 0) { throw new IllegalArgumentException("Illegal DST savings"); } else { this.dstSavings = var1; } } public int getDSTSavings() { return this.dstSavings; } public boolean useDaylightTime() { return this.useDaylight; } public boolean inDaylightTime(Date var1) { GregorianCalendar var2 = new GregorianCalendar(this); ((Calendar)var2).setTime(var1); return var2.inDaylightTime(); } public Object clone() { return super.clone(); } public synchronized int hashCode() { return this.startMonth ^ this.startDay ^ this.startDayOfWeek ^ this.startTime ^ this.endMonth ^ this.endDay ^ this.endDayOfWeek ^ this.endTime ^ this.rawOffset; } public boolean equals(Object var1) { if (this == var1) { return true; } else if (!(var1 instanceof SimpleTimeZone)) { return false; } else { SimpleTimeZone var2 = (SimpleTimeZone)var1; return ((TimeZone)this).getID().equals(((TimeZone)var2).getID()) && this.hasSameRules(var2); } } public boolean hasSameRules(TimeZone var1) { if (this == var1) { return true; } else if (!(var1 instanceof SimpleTimeZone)) { return false; } else { SimpleTimeZone var2 = (SimpleTimeZone)var1; return this.rawOffset == var2.rawOffset && this.useDaylight == var2.useDaylight && (!this.useDaylight || this.dstSavings == var2.dstSavings && this.startMode == var2.startMode && this.startMonth == var2.startMonth && this.startDay == var2.startDay && this.startDayOfWeek == var2.startDayOfWeek && this.startTime == var2.startTime && this.startTimeMode == var2.startTimeMode && this.endMode == var2.endMode && this.endMonth == var2.endMonth && this.endDay == var2.endDay && this.endDayOfWeek == var2.endDayOfWeek && this.endTime == var2.endTime && this.endTimeMode == var2.endTimeMode && this.startYear == var2.startYear); } } public String toString() { return this.getClass().getName() + "[id=" + ((TimeZone)this).getID() + ",offset=" + this.rawOffset + ",dstSavings=" + this.dstSavings + ",useDaylight=" + this.useDaylight + ",startYear=" + this.startYear + ",startMode=" + this.startMode + ",startMonth=" + this.startMonth + ",startDay=" + this.startDay + ",startDayOfWeek=" + this.startDayOfWeek + ",startTime=" + this.startTime + ",startTimeMode=" + this.startTimeMode + ",endMode=" + this.endMode + ",endMonth=" + this.endMonth + ",endDay=" + this.endDay + ",endDayOfWeek=" + this.endDayOfWeek + ",endTime=" + this.endTime + ",endTimeMode=" + this.endTimeMode + ']'; } private void decodeRules() { this.decodeStartRule(); this.decodeEndRule(); } private void decodeStartRule() { this.useDaylight = this.startDay != 0 && this.endDay != 0; if (this.startDay != 0) { if (this.startMonth < 0 || this.startMonth > 11) { throw new IllegalArgumentException("Illegal start month " + this.startMonth); } if (this.startTime < 0 || this.startTime >= 86400000) { throw new IllegalArgumentException("Illegal start time " + this.startTime); } if (this.startDayOfWeek == 0) { this.startMode = 1; } else { if (this.startDayOfWeek > 0) { this.startMode = 2; } else { this.startDayOfWeek = -this.startDayOfWeek; if (this.startDay > 0) { this.startMode = 3; } else { this.startDay = -this.startDay; this.startMode = 4; } } if (this.startDayOfWeek > 7) { throw new IllegalArgumentException("Illegal start day of week " + this.startDayOfWeek); } } if (this.startMode == 2) { if (this.startDay < -5 || this.startDay > 5) { throw new IllegalArgumentException("Illegal start day of week in month " + this.startDay); } } else if (this.startDay < 1 || this.startDay > staticMonthLength[this.startMonth]) { throw new IllegalArgumentException("Illegal start day " + this.startDay); } } } private void decodeEndRule() { this.useDaylight = this.startDay != 0 && this.endDay != 0; if (this.endDay != 0) { if (this.endMonth < 0 || this.endMonth > 11) { throw new IllegalArgumentException("Illegal end month " + this.endMonth); } if (this.endTime < 0 || this.endTime >= 86400000) { throw new IllegalArgumentException("Illegal end time " + this.endTime); } if (this.endDayOfWeek == 0) { this.endMode = 1; } else { if (this.endDayOfWeek > 0) { this.endMode = 2; } else { this.endDayOfWeek = -this.endDayOfWeek; if (this.endDay > 0) { this.endMode = 3; } else { this.endDay = -this.endDay; this.endMode = 4; } } if (this.endDayOfWeek > 7) { throw new IllegalArgumentException("Illegal end day of week " + this.endDayOfWeek); } } if (this.endMode == 2) { if (this.endDay < -5 || this.endDay > 5) { throw new IllegalArgumentException("Illegal end day of week in month " + this.endDay); } } else if (this.endDay < 1 || this.endDay > staticMonthLength[this.endMonth]) { throw new IllegalArgumentException("Illegal end day " + this.endDay); } } } private void makeRulesCompatible() { switch (this.startMode) { case 1: this.startDay = 1 + this.startDay / 7; this.startDayOfWeek = 1; case 2: default: break; case 3: if (this.startDay != 1) { this.startDay = 1 + this.startDay / 7; } break; case 4: if (this.startDay >= 30) { this.startDay = -1; } else { this.startDay = 1 + this.startDay / 7; } } switch (this.endMode) { case 1: this.endDay = 1 + this.endDay / 7; this.endDayOfWeek = 1; case 2: default: break; case 3: if (this.endDay != 1) { this.endDay = 1 + this.endDay / 7; } break; case 4: if (this.endDay >= 30) { this.endDay = -1; } else { this.endDay = 1 + this.endDay / 7; } } switch (this.startTimeMode) { case 2: this.startTime += this.rawOffset; } while(this.startTime < 0) { this.startTime += 86400000; this.startDayOfWeek = 1 + (this.startDayOfWeek + 5) % 7; } while(this.startTime >= 86400000) { this.startTime -= 86400000; this.startDayOfWeek = 1 + this.startDayOfWeek % 7; } switch (this.endTimeMode) { case 1: this.endTime += this.dstSavings; break; case 2: this.endTime += this.rawOffset + this.dstSavings; } while(this.endTime < 0) { this.endTime += 86400000; this.endDayOfWeek = 1 + (this.endDayOfWeek + 5) % 7; } while(this.endTime >= 86400000) { this.endTime -= 86400000; this.endDayOfWeek = 1 + this.endDayOfWeek % 7; } } private byte[] packRules() { byte[] var1 = new byte[]{(byte)this.startDay, (byte)this.startDayOfWeek, (byte)this.endDay, (byte)this.endDayOfWeek, (byte)this.startTimeMode, (byte)this.endTimeMode}; return var1; } private void unpackRules(byte[] var1) { this.startDay = var1[0]; this.startDayOfWeek = var1[1]; this.endDay = var1[2]; this.endDayOfWeek = var1[3]; if (var1.length >= 6) { this.startTimeMode = var1[4]; this.endTimeMode = var1[5]; } } private int[] packTimes() { int[] var1 = new int[]{this.startTime, this.endTime}; return var1; } private void unpackTimes(int[] var1) { this.startTime = var1[0]; this.endTime = var1[1]; } private void writeObject(ObjectOutputStream var1) throws IOException { byte[] var2 = this.packRules(); int[] var3 = this.packTimes(); this.makeRulesCompatible(); var1.defaultWriteObject(); var1.writeInt(var2.length); var1.write(var2); var1.writeObject(var3); this.unpackRules(var2); this.unpackTimes(var3); } private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException { var1.defaultReadObject(); if (this.serialVersionOnStream < 1) { if (this.startDayOfWeek == 0) { this.startDayOfWeek = 1; } if (this.endDayOfWeek == 0) { this.endDayOfWeek = 1; } this.startMode = this.endMode = 2; this.dstSavings = 3600000; } else { int var2 = var1.readInt(); byte[] var3 = new byte[var2]; var1.readFully(var3); this.unpackRules(var3); } if (this.serialVersionOnStream >= 2) { int[] var4 = (int[])var1.readObject(); this.unpackTimes(var4); } this.serialVersionOnStream = 2; } }