calendar.java
来自「《移动Agent技术》一书的所有章节源代码。」· Java 代码 · 共 1,118 行 · 第 1/3 页
JAVA
1,118 行
public final static int AM = 0;
/**
* Useful constant for hour in 12-hour clock. Used in GregorianCalendar.
*/
public final static int PM = 1;
// Internal notes:
// Calendar contains two kinds of time representations: current "time" in
// milliseconds, and a set of time "fields" representing the current time.
// The two representations are usually in sync, but can get out of sync
// as follows.
// 1. Initially, no fields are set, and the time is invalid.
// 2. If the time is set, all fields are computed and in sync.
// 3. If a single field is set, the time is invalid.
// Recomputation of the time and fields happens when the object needs
// to return a result to the user, or use a result for a computation.
/**
* The time fields containing values into which the millis is computed.
*/
protected int fields[]; // NOTE: Make transient when possible
/**
* The flags which tell if a specified time field for the calendar is set.
* A new object has no fields set. After the first call to a method
* which generates the fields, they all remain set after that.
*/
protected boolean isSet[]; // NOTE: Remove when possible
/**
* Pseudo-time-stamps which specify when each field was set. There
* are two special values, UNSET and INTERNALLY_SET. Values from
* MINIMUM_USER_SET to Integer.MAX_VALUE are legal user set values.
*/
transient int stamp[];
/**
* The current time set for the calendar.
*/
protected long time;
/**
* The flag which indicates if the current time is set for the calendar.
* The time is made invalid by the user setting an individual field.
*/
protected boolean isTimeSet; // NOTE: Make transient when possible
/**
* True if the fields are in sync with the currently set time of this Calendar.
* If false, then the next attempt to get the value of a field will
* force a recomputation of all fields from the current value of the time
* field.
*
* This should really be named areFieldsInSync, but the old name is retained
* for backward compatibility.
*/
protected boolean areFieldsSet; // NOTE: Make transient when possible
/**
* True if all fields have been set.
*
* NOTE: MAKE PROTECTED AT NEXT API CHANGE, or ADD ACCESSOR METHODS.
*/
transient boolean areAllFieldsSet;
/**
* @see #setLenient
*/
private boolean lenient = true;
/**
* Time zone affects the time calculation done by Calendar. Calendar uses
* the time zone data to produce the local time. Both firstDayOfWeek
* and minimalDaysInFirstWeek are locale-dependent. For example,
* in US locale, firstDayOfWeek is SUNDAY; minimalDaysInFirstWeek is 1.
* They are used to figure out the week count for a specific date for
* a given locale. These must be set when a Calendar is constructed.
*/
private TimeZone zone;
private int firstDayOfWeek;
private int minimalDaysInFirstWeek;
/**
* Cache to hold the firstDayOfWeek and minimalDaysInFirstWeek
* of a Locale.
*/
private static Hashtable cachedLocaleData = new Hashtable(3);
// Special values of stamp[]
static final int UNSET = 0;
static final int INTERNALLY_SET = 1;
static final int MINIMUM_USER_STAMP = 2;
// The next available value for stampp[]
private int nextStamp = MINIMUM_USER_STAMP;
// the internal serial version which says which version was written
// - 0 (default) for version up to JDK 1.1.5
// - 1 for version from JDK 1.1.6, which writes a correct 'time' value
// as well as compatible values for other fields. This is a
// transitional format.
// - 2 (not implemented yet) a future version, in which fields[],
// areFieldsSet, and isTimeSet become transient, and isSet[] is
// removed. In JDK 1.1.6 we write a format compatible with version 2.
static final int currentSerialVersion = 1;
private int serialVersionOnStream = currentSerialVersion;
// Proclaim serialization compatibility with JDK 1.1
static final long serialVersionUID = -1807547505821590642L;
/**
* Constructs a Calendar with the default time zone as returned
* by TimeZone.getDefault(), and the default locale.
* @see TimeZone#getDefault
*/
protected Calendar()
{
this(TimeZone.getDefault(), Locale.getDefault());
}
/**
* Constructs a Calendar with the given time zone and locale.
* @param zone the given time zone.
*/
protected Calendar(TimeZone zone, Locale aLocale)
{
fields = new int[FIELD_COUNT];
isSet = new boolean[FIELD_COUNT];
stamp = new int[FIELD_COUNT];
this.zone = zone;
setWeekCountData(aLocale);
}
/**
* Gets a Calendar using the default timezone and locale.
* @return a Calendar.
*/
public static synchronized Calendar getInstance()
{
return new GregorianCalendar();
}
/**
* Gets a Calendar using the given timezone and default locale.
* @param zone the given timezone.
* @return a Calendar.
*/
public static synchronized Calendar getInstance(TimeZone zone)
{
return new GregorianCalendar(zone, Locale.getDefault());
}
/**
* Gets a Calendar using the default timezone and given locale.
* @param aLocale the given locale.
* @return a Calendar.
*/
public static synchronized Calendar getInstance(Locale aLocale)
{
return new GregorianCalendar(TimeZone.getDefault(), aLocale);
}
/**
* Gets a Calendar using the given timezone and given locale.
* @param zone the given timezone.
* @param aLocale the given locale.
* @return a Calendar.
*/
public static synchronized Calendar getInstance(TimeZone zone,
Locale aLocale)
{
return new GregorianCalendar(zone, aLocale);
}
/**
* Gets the set of locales for which Calendars are installed.
* @return the set of locales for which Calendars are installed.
*/
public static synchronized Locale[] getAvailableLocales()
{
return DateFormat.getAvailableLocales();
}
/**
* Converts Calendar's time field values to UTC as milliseconds.
*/
protected abstract void computeTime();
/**
* Converts UTC as milliseconds to time field values.
* This allows you to sync up the time field values with
* a new time that is set for the calendar. The time is <em>not</em>
* recomputed first; to recompute the time, then the fields, call the
* <code>complete</code> method.
* @see #complete
*/
protected abstract void computeFields();
/**
* Gets this Calendar's current time.
* @return the current time.
*/
public final Date getTime() {
return new Date( getTimeInMillis() );
}
/**
* Sets this Calendar's current time with the given Date.
* @param date the given Date.
*/
public final void setTime(Date date) {
setTimeInMillis( date.getTime() );
}
/**
* Gets this Calendar's current time as a long.
* @return the current time as UTC milliseconds from the epoch.
*/
protected long getTimeInMillis() {
if (!isTimeSet) updateTime();
return time;
}
/**
* Sets this Calendar's current time from the given long value.
* @param date the new time in UTC milliseconds from the epoch.
*/
protected void setTimeInMillis( long millis ) {
isTimeSet = true;
time = millis;
areFieldsSet = false;
if (!areFieldsSet) {
computeFields();
areFieldsSet = true;
areAllFieldsSet = true;
}
}
/**
* Gets the value for a given time field.
* @param field the given time field.
* @return the value for the given time field.
*/
public final int get(int field)
{
complete();
return fields[field];
}
/**
* Gets the value for a given time field. This is an internal
* fast time field value getter for the subclasses.
* @param field the given time field.
* @return the value for the given time field.
*/
protected final int internalGet(int field)
{
return fields[field];
}
/**
* Sets the value for the given time field. This is an internal
* fast setter for subclasses. It does not affect the areFieldsSet, isTimeSet,
* or areAllFieldsSet flags.
*/
final void internalSet(int field, int value)
{
fields[field] = value;
}
/**
* Sets the time field with the given value.
* @param field the given time field.
* @param value the value to be set for the given time field.
*/
public final void set(int field, int value)
{
isTimeSet = false;
fields[field] = value;
stamp[field] = nextStamp++;
areFieldsSet = false;
isSet[field] = true; // Remove later
}
/**
* Sets the values for the fields year, month, and date.
* Previous values of other fields are retained. If this is not desired,
* call <code>clear</code> first.
* @param year the value used to set the YEAR time field.
* @param month the value used to set the MONTH time field.
* Month value is 0-based. e.g., 0 for January.
* @param date the value used to set the DATE time field.
*/
public final void set(int year, int month, int date)
{
set(YEAR, year);
set(MONTH, month);
set(DATE, date);
}
/**
* Sets the values for the fields year, month, date, hour, and minute.
* Previous values of other fields are retained. If this is not desired,
* call <code>clear</code> first.
* @param year the value used to set the YEAR time field.
* @param month the value used to set the MONTH time field.
* Month value is 0-based. e.g., 0 for January.
* @param date the value used to set the DATE time field.
* @param hour the value used to set the HOUR_OF_DAY time field.
* @param minute the value used to set the MINUTE time field.
*/
public final void set(int year, int month, int date, int hour, int minute)
{
set(YEAR, year);
set(MONTH, month);
set(DATE, date);
set(HOUR_OF_DAY, hour);
set(MINUTE, minute);
}
/**
* Sets the values for the fields year, month, date, hour, minute, and second.
* Previous values of other fields are retained. If this is not desired,
* call <code>clear</code> first.
* @param year the value used to set the YEAR time field.
* @param month the value used to set the MONTH time field.
* Month value is 0-based. e.g., 0 for January.
* @param date the value used to set the DATE time field.
* @param hour the value used to set the HOUR_OF_DAY time field.
* @param minute the value used to set the MINUTE time field.
* @param second the value used to set the SECOND time field.
*/
public final void set(int year, int month, int date, int hour, int minute,
int second)
{
set(YEAR, year);
set(MONTH, month);
set(DATE, date);
set(HOUR_OF_DAY, hour);
set(MINUTE, minute);
set(SECOND, second);
}
/**
* Clears the values of all the time fields.
*/
public final void clear()
{
fields = new int[FIELD_COUNT];
stamp = new int[FIELD_COUNT];
areFieldsSet = false;
areAllFieldsSet = false;
isSet = new boolean[FIELD_COUNT]; // Remove later
}
/**
* Clears the value in the given time field.
* @param field the time field to be cleared.
*/
public final void clear(int field)
{
fields[field] = 0;
stamp[field] = UNSET;
areFieldsSet = false;
areAllFieldsSet = false;
isSet[field] = false; // Remove later
}
/**
* Determines if the given time field has a value set.
* @return true if the given time field has a value set; false otherwise.
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?