calendar.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 991 行 · 第 1/2 页

JAVA
991
字号
	 */
	public long getTimeInMillis() {
		if (!isTimeSet)
			computeTime();
		return time;
	}

	/**
	 * Sets this Calendar's time to the given Time.  All time fields
	 * are invalidated by this method.
	 * @param time the time in milliseconds since the epoch
	 * @specnote This was made public in 1.4.
	 */
	public void setTimeInMillis(long time) {
		this.time = time;
		isTimeSet = true;
		computeFields();
	}

	/**
	 * Gets the value of the specified field.  They are recomputed
	 * if they are invalid.
	 * @param field the time field. One of the time field constants.
	 * @return the value of the specified field
	 */
	public final int get(int field) {
		// If the requested field is invalid, force all fields to be recomputed.
		if (!isSet[field])
			areFieldsSet = false;
		complete();
		return fields[field];
	}

	/**
	 * Gets the value of the specified field. This method doesn't 
	 * recompute the fields, if they are invalid.
	 * @param field the time field. One of the time field constants.
	 * @return the value of the specified field, undefined if
	 * <code>areFieldsSet</code> or <code>isSet[field]</code> is false.
	 */
	protected final int internalGet(int field) {
		return fields[field];
	}

	/**
	 * Sets the time field with the given value.  This does invalidate
	 * the time in milliseconds.
	 * @param field the time field. One of the time field constants
	 * @param value the value to be set.
	 */
	public final void set(int field, int value) {
		isTimeSet = false;
		fields[field] = value;
		isSet[field] = true;
		switch (field) {
			case YEAR :
			case MONTH :
			case DATE :
				isSet[WEEK_OF_YEAR] = false;
				isSet[DAY_OF_YEAR] = false;
				isSet[WEEK_OF_MONTH] = false;
				isSet[DAY_OF_WEEK] = false;
				isSet[DAY_OF_WEEK_IN_MONTH] = false;
				break;
			case AM_PM :
				isSet[HOUR_OF_DAY] = false;
				break;
			case HOUR_OF_DAY :
				isSet[AM_PM] = false;
				isSet[HOUR] = false;
				break;
			case HOUR :
				isSet[HOUR_OF_DAY] = false;
				break;
		}
	}

	/**
	 * Sets the fields for year, month, and date
	 * @param year the year.
	 * @param month the month, one of the constants JANUARY..UNDICEMBER.
	 * @param date the day of the month
	 */
	public final void set(int year, int month, int date) {
		isTimeSet = false;
		fields[YEAR] = year;
		fields[MONTH] = month;
		fields[DATE] = date;
		isSet[YEAR] = isSet[MONTH] = isSet[DATE] = true;
		isSet[WEEK_OF_YEAR] = false;
		isSet[DAY_OF_YEAR] = false;
		isSet[WEEK_OF_MONTH] = false;
		isSet[DAY_OF_WEEK] = false;
		isSet[DAY_OF_WEEK_IN_MONTH] = false;
	}

	/**
	 * Sets the fields for year, month, date, hour, and minute
	 * @param year the year.
	 * @param month the month, one of the constants JANUARY..UNDICEMBER.
	 * @param date the day of the month
	 * @param hour the hour of day.
	 * @param minute the minute.
	 */
	public final void set(
		int year,
		int month,
		int date,
		int hour,
		int minute) {
		set(year, month, date);
		fields[HOUR_OF_DAY] = hour;
		fields[MINUTE] = minute;
		isSet[HOUR_OF_DAY] = isSet[MINUTE] = true;
		isSet[AM_PM] = false;
		isSet[HOUR] = false;
	}

	/**
	 * Sets the fields for year, month, date, hour, and minute
	 * @param year the year.
	 * @param month the month, one of the constants JANUARY..UNDICEMBER.
	 * @param date the day of the month
	 * @param hour the hour of day.
	 * @param minute the minute.
	 * @param second the second.
	 */
	public final void set(
		int year,
		int month,
		int date,
		int hour,
		int minute,
		int second) {
		set(year, month, date, hour, minute);
		fields[SECOND] = second;
		isSet[SECOND] = true;
	}

	/**
	 * Clears the values of all the time fields.
	 */
	public final void clear() {
		isTimeSet = false;
		areFieldsSet = false;
		for (int i = 0; i < FIELD_COUNT; i++) {
			isSet[i] = false;
			fields[i] = 0;
		}
	}

	/**
	 * Clears the values of the specified time field.
	 * @param field the time field. One of the time field constants.
	 */
	public final void clear(int field) {
		isTimeSet = false;
		areFieldsSet = false;
		isSet[field] = false;
		fields[field] = 0;
	}

	/**
	 * Determines if the specified field has a valid value.
	 * @return true if the specified field has a value.
	 */
	public final boolean isSet(int field) {
		return isSet[field];
	}

	/**
	 * Fills any unset fields in the time field list
	 * @return true if the specified field has a value.  
	 */
	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) {
		return (o instanceof Calendar)
			&& getTimeInMillis() == ((Calendar) o).getTimeInMillis();
	}

	/**
	 * 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();
		return (int) ((time & 0xffffffffL) ^ (time >> 32));
	}

	/**
	 * 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.
	 */
	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.
	 */
	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.  
	 * @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.
	 * @since jdk1.2
	 */
	// FIXME: XXX: Not abstract in JDK 1.2.
	public abstract int getActualMinimum(int field);

	/**
	 * 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.  
	 * @since jdk1.2
	 */
	// FIXME: XXX: Not abstract in JDK 1.2.
	public abstract int getActualMaximum(int field);

	/**
	 * 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 final static 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 + =
减小字号Ctrl + -
显示快捷键?