⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpletimezone.java

📁 gcc的组建
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
  }  /**   * Sets the standard time zone offset to GMT.   * @param rawOffset The time offset from GMT in milliseconds.   */  public void setRawOffset(int rawOffset)  {    this.rawOffset = rawOffset;  }  /**   * Gets the daylight savings offset.  This is a positive offset in   * milliseconds with respect to standard time.  Typically this   * is one hour, but for some time zones this may be half an our.   * @return the daylight savings offset in milliseconds.   *   * @since 1.2   */  public int getDSTSavings()  {    return dstSavings;  }  /**   * Sets the daylight savings offset.  This is a positive offset in   * milliseconds with respect to standard time.   *   * @param dstSavings the daylight savings offset in milliseconds.   *   * @since 1.2   */  public void setDSTSavings(int dstSavings)  {    if (dstSavings <= 0)      throw new IllegalArgumentException("illegal value for dstSavings");    this.dstSavings = dstSavings;  }  /**   * Returns if this time zone uses daylight savings time.   * @return true, if we use daylight savings time, false otherwise.   */  public boolean useDaylightTime()  {    return useDaylight;  }  /**   * Returns the number of days in the given month.   * Uses gregorian rules prior to 1582 (The default and earliest cutover)   * @param month The month, zero based; use one of the Calendar constants.   * @param year  The year.   */  private int getDaysInMonth(int month, int year)  {    if (month == Calendar.FEBRUARY)      {	if ((year & 3) != 0)	  return 28;	// Assume default Gregorian cutover, 	// all years prior to this must be Julian	if (year < 1582)	  return 29;	// Gregorian rules 	return ((year % 100) != 0 || (year % 400) == 0) ? 29 : 28;      }    else      return monthArr[month];  }  /**   * Checks if the date given in calXXXX, is before the change between   * dst and standard time.   * @param calYear the year of the date to check (for leap day checking).   * @param calMonth the month of the date to check.   * @param calDayOfMonth the day of month of the date to check.   * @param calDayOfWeek the day of week of the date to check.   * @param calMillis the millis of day of the date to check (standard time).   * @param mode  the change mode; same semantic as startMode.   * @param month the change month; same semantic as startMonth.   * @param day   the change day; same semantic as startDay.   * @param dayOfWeek the change day of week;   * @param millis the change time in millis since midnight standard time.   * same semantic as startDayOfWeek.   * @return true, if cal is before the change, false if cal is on   * or after the change.   */  private boolean isBefore(int calYear, int calMonth, int calDayOfMonth,                           int calDayOfWeek, int calMillis, int mode,                           int month, int day, int dayOfWeek, int millis)  {    // This method is called by Calendar, so we mustn't use that class.    // We have to do all calculations by hand.    // check the months:    // XXX - this is not correct:    // for the DOW_GE_DOM and DOW_LE_DOM modes the change date may    // be in a different month.    if (calMonth != month)      return calMonth < month;    // check the day:    switch (mode)      {      case DOM_MODE:	if (calDayOfMonth != day)	  return calDayOfMonth < day;	break;      case DOW_IN_MONTH_MODE:        {	  // This computes the day of month of the day of type	  // "dayOfWeek" that lies in the same (sunday based) week as cal.	  calDayOfMonth += (dayOfWeek - calDayOfWeek);	  // Now we convert it to 7 based number (to get a one based offset	  // after dividing by 7).  If we count from the end of the	  // month, we get want a -7 based number counting the days from 	  // the end:	  if (day < 0)	    calDayOfMonth -= getDaysInMonth(calMonth, calYear) + 7;	  else	    calDayOfMonth += 6;	  //  day > 0                    day < 0	  //  S  M  T  W  T  F  S        S  M  T  W  T  F  S	  //     7  8  9 10 11 12         -36-35-34-33-32-31	  // 13 14 15 16 17 18 19      -30-29-28-27-26-25-24	  // 20 21 22 23 24 25 26      -23-22-21-20-19-18-17	  // 27 28 29 30 31 32 33      -16-15-14-13-12-11-10	  // 34 35 36                   -9 -8 -7	  // Now we calculate the day of week in month:	  int week = calDayOfMonth / 7;	  //  day > 0                    day < 0	  //  S  M  T  W  T  F  S        S  M  T  W  T  F  S	  //     1  1  1  1  1  1          -5 -5 -4 -4 -4 -4	  //  1  2  2  2  2  2  2       -4 -4 -4 -3 -3 -3 -3	  //  2  3  3  3  3  3  3       -3 -3 -3 -2 -2 -2 -2	  //  3  4  4  4  4  4  4       -2 -2 -2 -1 -1 -1 -1	  //  4  5  5                   -1 -1 -1	  if (week != day)	    return week < day;	  if (calDayOfWeek != dayOfWeek)	    return calDayOfWeek < dayOfWeek;	  // daylight savings starts/ends  on the given day.	  break;        }      case DOW_LE_DOM_MODE:	// The greatest sunday before or equal December, 12	// is the same as smallest sunday after or equal December, 6.	day = Math.abs(day) - 6;      case DOW_GE_DOM_MODE:	// Calculate the day of month of the day of type	// "dayOfWeek" that lies before (or on) the given date.	calDayOfMonth -= (calDayOfWeek < dayOfWeek ? 7 : 0) + calDayOfWeek	- dayOfWeek;	if (calDayOfMonth < day)	  return true;	if (calDayOfWeek != dayOfWeek || calDayOfMonth >= day + 7)	  return false;	// now we have the same day	break;      }    // the millis decides:    return (calMillis < millis);  }  /**   * Determines if the given date is in daylight savings time.   * @return true, if it is in daylight savings time, false otherwise.   */  public boolean inDaylightTime(Date date)  {    Calendar cal = Calendar.getInstance(this);    cal.setTime(date);    return (cal.get(Calendar.DST_OFFSET) != 0);  }  /**   * Generates the hashCode for the SimpleDateFormat object.  It is   * the rawOffset, possibly, if useDaylightSavings is true, xored   * with startYear, startMonth, startDayOfWeekInMonth, ..., endTime.   */  public synchronized int hashCode()  {    return rawOffset           ^ (useDaylight              ? startMonth ^ startDay ^ startDayOfWeek ^ startTime ^ endMonth              ^ endDay ^ endDayOfWeek ^ endTime : 0);  }  public synchronized boolean equals(Object o)  {    if (this == o)      return true;    if (! (o instanceof SimpleTimeZone))      return false;    SimpleTimeZone zone = (SimpleTimeZone) o;    if (zone.hashCode() != hashCode() || ! getID().equals(zone.getID())        || rawOffset != zone.rawOffset || useDaylight != zone.useDaylight)      return false;    if (! useDaylight)      return true;    return (startYear == zone.startYear && startMonth == zone.startMonth           && startDay == zone.startDay           && startDayOfWeek == zone.startDayOfWeek           && startTime == zone.startTime           && startTimeMode == zone.startTimeMode && endMonth == zone.endMonth           && endDay == zone.endDay && endDayOfWeek == zone.endDayOfWeek           && endTime == zone.endTime && endTimeMode == zone.endTimeMode);  }  /**   * Test if the other time zone uses the same rule and only   * possibly differs in ID.  This implementation for this particular   * class will return true if the other object is a SimpleTimeZone,   * the raw offsets and useDaylight are identical and if useDaylight   * is true, also the start and end datas are identical.   * @return true if this zone uses the same rule.   */  public boolean hasSameRules(TimeZone other)  {    if (this == other)      return true;    if (! (other instanceof SimpleTimeZone))      return false;    SimpleTimeZone zone = (SimpleTimeZone) other;    if (zone.hashCode() != hashCode() || rawOffset != zone.rawOffset        || useDaylight != zone.useDaylight)      return false;    if (! useDaylight)      return true;    return (startYear == zone.startYear && startMonth == zone.startMonth           && startDay == zone.startDay           && startDayOfWeek == zone.startDayOfWeek           && startTime == zone.startTime           && startTimeMode == zone.startTimeMode && endMonth == zone.endMonth           && endDay == zone.endDay && endDayOfWeek == zone.endDayOfWeek           && endTime == zone.endTime && endTimeMode == zone.endTimeMode);  }  /**   * Returns a string representation of this SimpleTimeZone object.   * @return a string representation of this SimpleTimeZone object.   */  public String toString()  {    // the test for useDaylight is an incompatibility to jdk1.2, but    // I think this shouldn't hurt.    return getClass().getName() + "[" + "id=" + getID() + ",offset="           + rawOffset + ",dstSavings=" + dstSavings + ",useDaylight="           + useDaylight           + (useDaylight              ? ",startYear=" + startYear + ",startMode=" + startMode              + ",startMonth=" + startMonth + ",startDay=" + startDay              + ",startDayOfWeek=" + startDayOfWeek + ",startTime="              + startTime + ",startTimeMode=" + startTimeMode + ",endMode="              + endMode + ",endMonth=" + endMonth + ",endDay=" + endDay              + ",endDayOfWeek=" + endDayOfWeek + ",endTime=" + endTime              + ",endTimeMode=" + endTimeMode : "") + "]";  }  /**   * Reads a serialized simple time zone from stream.   * @see #writeObject   */  private void readObject(java.io.ObjectInputStream input)    throws java.io.IOException, ClassNotFoundException  {    input.defaultReadObject();    if (serialVersionOnStream == 0)      {	// initialize the new fields to default values.	dstSavings = 60 * 60 * 1000;	endMode = DOW_IN_MONTH_MODE;	startMode = DOW_IN_MONTH_MODE;	startTimeMode = WALL_TIME;	endTimeMode = WALL_TIME;	serialVersionOnStream = 2;      }    else      {	int length = input.readInt();	byte[] byteArray = new byte[length];	input.read(byteArray, 0, length);	if (length >= 4)	  {	    // Lets hope that Sun does extensions to the serialized	    // form in a sane manner.	    startDay = byteArray[0];	    startDayOfWeek = byteArray[1];	    endDay = byteArray[2];	    endDayOfWeek = byteArray[3];	  }      }  }  /**   * Serializes this object to a stream.  @serialdata The object is   * first written in the old JDK 1.1 format, so that it can be read   * by by the old classes.  This means, that the   * <code>start/endDay(OfWeek)</code>-Fields are written in the   * DOW_IN_MONTH_MODE rule, since this was the only supported rule   * in 1.1.   *   * In the optional section, we write first the length of an byte   * array as int and afterwards the byte array itself.  The byte   * array contains in this release four elements, namely the real   * startDay, startDayOfWeek endDay, endDayOfWeek in that Order.   * These fields are needed, because for compatibility reasons only   * approximative values are written to the required section, as   * described above.   */  private void writeObject(java.io.ObjectOutputStream output)    throws java.io.IOException  {    byte[] byteArray = new byte[]                       {                         (byte) startDay, (byte) startDayOfWeek, (byte) endDay,                         (byte) endDayOfWeek                       };    /* calculate the approximation for JDK 1.1 */    switch (startMode)      {      case DOM_MODE:	startDayOfWeek = Calendar.SUNDAY; // random day of week      // fall through      case DOW_GE_DOM_MODE:      case DOW_LE_DOM_MODE:	startDay = (startDay + 6) / 7;      }    switch (endMode)      {      case DOM_MODE:	endDayOfWeek = Calendar.SUNDAY;      // fall through      case DOW_GE_DOM_MODE:      case DOW_LE_DOM_MODE:	endDay = (endDay + 6) / 7;      }    // the required part:    output.defaultWriteObject();    // the optional part:    output.writeInt(byteArray.length);    output.write(byteArray, 0, byteArray.length);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -