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 + -
显示快捷键?