📄 calendar.java
字号:
* the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. */ public final void clear(int field) { int[] tempFields = { 1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, 0, 0, 0, 0, 0, zone.getRawOffset(), 0 }; isTimeSet = false; areFieldsSet = false; isSet[field] = false; fields[field] = tempFields[field]; } /** * Determines if the specified field has a valid value. * @return true if the specified field has a value. * @throws ArrayIndexOutOfBoundsException if the field is outside * the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. */ public final boolean isSet(int field) { return isSet[field]; } /** * Fills any unset fields in the time field list */ protected void complete() { if (! isTimeSet) computeTime(); if (! areFieldsSet) computeFields(); } /** * Compares the given calendar with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, that represents * the same time (but doesn't necessary have the same fields). */ public boolean equals(Object o) { if (! (o instanceof Calendar)) return false; Calendar cal = (Calendar) o; if (getTimeInMillis() == ((Calendar) o).getTimeInMillis() && cal.getFirstDayOfWeek() == getFirstDayOfWeek() && cal.isLenient() == isLenient() && cal.getMinimalDaysInFirstWeek() == getMinimalDaysInFirstWeek()) { TimeZone self = getTimeZone(); TimeZone oth = cal.getTimeZone(); return self == null ? oth == null : self.equals(oth); } return false; } /** * Returns a hash code for this calendar. * @return a hash code, which fullfits the general contract of * <code>hashCode()</code> */ public int hashCode() { long time = getTimeInMillis(); int val = (int) ((time & 0xffffffffL) ^ (time >> 32)); val += (getFirstDayOfWeek() + (isLenient() ? 1230 : 1237) + getMinimalDaysInFirstWeek()); TimeZone self = getTimeZone(); if (self != null) val ^= self.hashCode(); return val; } /** * Compares the given calendar with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, and this calendar * represents a smaller time than the calendar o. * @exception ClassCastException if o is not an calendar. * @since JDK1.2 you don't need to override this method */ public boolean before(Object o) { return getTimeInMillis() < ((Calendar) o).getTimeInMillis(); } /** * Compares the given calendar with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, and this calendar * represents a bigger time than the calendar o. * @exception ClassCastException if o is not an calendar. * @since JDK1.2 you don't need to override this method */ public boolean after(Object o) { return getTimeInMillis() > ((Calendar) o).getTimeInMillis(); } /** * Adds the specified amount of time to the given time field. The * amount may be negative to subtract the time. If the field overflows * 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. * @throws ArrayIndexOutOfBoundsException if the field is outside * the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. */ public abstract void add(int field, int amount); /** * Rolls the specified time field up or down. This means add one * to the specified field, but don't change the other fields. If * the maximum for this field is reached, start over with the * minimum value. <br> * * <strong>Note:</strong> There may be situation, where the other * fields must be changed, e.g rolling the month on May, 31. * The date June, 31 is automatically converted to July, 1. * @param field the time field. One of the time field constants. * @param up the direction, true for up, false for down. * @throws ArrayIndexOutOfBoundsException if the field is outside * the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. */ public abstract void roll(int field, boolean up); /** * Rolls up or down the specified time field by the given amount. * A negative amount rolls down. The default implementation is * call <code>roll(int, boolean)</code> for the specified amount. * * Subclasses should override this method to do more intuitiv things. * * @param field the time field. One of the time field constants. * @param amount the amount to roll by, positive for rolling up, * negative for rolling down. * @throws ArrayIndexOutOfBoundsException if the field is outside * the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. * @since JDK1.2 */ public void roll(int field, int amount) { while (amount > 0) { roll(field, true); amount--; } while (amount < 0) { roll(field, false); amount++; } } /** * Sets the time zone to the specified value. * @param zone the new time zone */ public void setTimeZone(TimeZone zone) { this.zone = zone; } /** * Gets the time zone of this calendar * @return the current time zone. */ public TimeZone getTimeZone() { return zone; } /** * Specifies if the date/time interpretation should be lenient. * If the flag is set, a date such as "February 30, 1996" will be * treated as the 29th day after the February 1. If this flag * is false, such dates will cause an exception. * @param lenient true, if the date should be interpreted linient, * false if it should be interpreted strict. */ public void setLenient(boolean lenient) { this.lenient = lenient; } /** * Tells if the date/time interpretation is lenient. * @return true, if the date should be interpreted linient, * false if it should be interpreted strict. */ public boolean isLenient() { return lenient; } /** * Sets what the first day of week is. This is used for * WEEK_OF_MONTH and WEEK_OF_YEAR fields. * @param value the first day of week. One of SUNDAY to SATURDAY. */ public void setFirstDayOfWeek(int value) { firstDayOfWeek = value; } /** * Gets what the first day of week is. This is used for * WEEK_OF_MONTH and WEEK_OF_YEAR fields. * @return the first day of week. One of SUNDAY to SATURDAY. */ public int getFirstDayOfWeek() { return firstDayOfWeek; } /** * Sets how many days are required in the first week of the year. * If the first day of the year should be the first week you should * set this value to 1. If the first week must be a full week, set * it to 7. * @param value the minimal days required in the first week. */ public void setMinimalDaysInFirstWeek(int value) { minimalDaysInFirstWeek = value; } /** * Gets how many days are required in the first week of the year. * @return the minimal days required in the first week. * @see #setMinimalDaysInFirstWeek */ public int getMinimalDaysInFirstWeek() { return minimalDaysInFirstWeek; } /** * Gets the smallest value that is allowed for the specified field. * @param field the time field. One of the time field constants. * @return the smallest value. */ public abstract int getMinimum(int field); /** * Gets the biggest value that is allowed for the specified field. * @param field the time field. One of the time field constants. * @return the biggest value. */ public abstract int getMaximum(int field); /** * Gets the greatest minimum value that is allowed for the specified field. * @param field the time field. One of the time field constants. * @return the greatest minimum value. */ public abstract int getGreatestMinimum(int field); /** * Gets the smallest maximum value that is allowed for the * specified field. For example this is 28 for DAY_OF_MONTH. * @param field the time field. One of the time field constants. * @return the least maximum value. */ public abstract int getLeastMaximum(int field); /** * Gets the actual minimum value that is allowed for the specified field. * This value is dependent on the values of the other fields. * @param field the time field. One of the time field constants. * @return the actual minimum value. * @throws ArrayIndexOutOfBoundsException if the field is outside * the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. * @since jdk1.2 */ public int getActualMinimum(int field) { Calendar tmp = (Calendar) clone(); // To avoid restoring state int min = tmp.getGreatestMinimum(field); int end = tmp.getMinimum(field); tmp.set(field, min); for (; min > end; min--) { tmp.add(field, -1); // Try to get smaller if (tmp.get(field) != min - 1) break; // Done if not successful } return min; } /** * Gets the actual maximum value that is allowed for the specified field. * This value is dependent on the values of the other fields. * @param field the time field. One of the time field constants. * @return the actual maximum value. * @throws ArrayIndexOutOfBoundsException if the field is outside * the valid range. The value of field must be >= 0 and * <= <code>FIELD_COUNT</code>. * @since jdk1.2 */ public int getActualMaximum(int field) { Calendar tmp = (Calendar) clone(); // To avoid restoring state int max = tmp.getLeastMaximum(field); int end = tmp.getMaximum(field); tmp.set(field, max); for (; max < end; max++) { tmp.add(field, 1); if (tmp.get(field) != max + 1) break; } return max; } /** * Return a clone of this object. */ public Object clone() { try { Calendar cal = (Calendar) super.clone(); cal.fields = (int[]) fields.clone(); cal.isSet = (boolean[]) isSet.clone(); return cal; } catch (CloneNotSupportedException ex) { return null; } } private static final String[] fieldNames = { ",ERA=", ",YEAR=", ",MONTH=", ",WEEK_OF_YEAR=", ",WEEK_OF_MONTH=", ",DAY_OF_MONTH=", ",DAY_OF_YEAR=", ",DAY_OF_WEEK=", ",DAY_OF_WEEK_IN_MONTH=", ",AM_PM=", ",HOUR=", ",HOUR_OF_DAY=", ",MINUTE=", ",SECOND=", ",MILLISECOND=", ",ZONE_OFFSET=", ",DST_OFFSET=" }; /** * Returns a string representation of this object. It is mainly * for debugging purposes and its content is implementation * specific. */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append(getClass().getName()).append('['); sb.append("time="); if (isTimeSet) sb.append(time); else sb.append("?"); sb.append(",zone=" + zone); sb.append(",areFieldsSet=" + areFieldsSet); for (int i = 0; i < FIELD_COUNT; i++) { sb.append(fieldNames[i]); if (isSet[i]) sb.append(fields[i]); else sb.append("?"); } sb.append(",lenient=").append(lenient); sb.append(",firstDayOfWeek=").append(firstDayOfWeek); sb.append(",minimalDaysInFirstWeek=").append(minimalDaysInFirstWeek); sb.append("]"); return sb.toString(); } /** * Saves the state of the object to the stream. Ideally we would * only write the time field, but we need to be compatible with * earlier versions. <br> * * This doesn't write the JDK1.1 field nextStamp to the stream, as * I don't know what it is good for, and because the documentation * says, that it could be omitted. */ private void writeObject(ObjectOutputStream stream) throws IOException { if (! isTimeSet) computeTime(); stream.defaultWriteObject(); } /** * Reads the object back from stream (deserialization). */ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); if (! isTimeSet) computeTime(); if (serialVersionOnStream > 1) { // This is my interpretation of the serial number: // Sun wants to remove all fields from the stream someday // and will then increase the serialVersion number again. // We prepare to be compatible. fields = new int[FIELD_COUNT]; isSet = new boolean[FIELD_COUNT]; areFieldsSet = false; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -