java.lang.Object java.util.Calendar java.util.GregorianCalendar
public class GregorianCalendar
GregorianCalendar
是 Calendar
的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar
是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在 1582 年 10 月 15 日创立,在其他国家/地区要晚一些)。可由调用者通过调用 setGregorianChange()
来更改起始日期。
历史上,在那些首先采用格里高利历的国家/地区中,1582 年 10 月 4 日(儒略历)之后就是 1582 年 10 月 15 日(格里高利历)。此日历正确地模拟了这些变化。在开始格里高利历之前,GregorianCalendar
实现的是儒略历。格里高利历和儒略历之间的唯一区别就是闰年规则。儒略历指定每 4 年就为闰年,而格里高利历则忽略不能被 400 整除的世纪年。
GregorianCalendar
可实现预期的 格里高利历和儒略历。也就是说,可以通过在时间上无限地向后或向前外推当前规则来计算日期。因此,对于所有的年份,都可以使用 GregorianCalendar
来生成有意义并且一致的结果。但是,采用现代儒略历规则时,使用 GregorianCalendar
得到的日期只在历史上从公元 4 年 3 月 1 日之后是准确的。在此日期之前,闰年规则的应用没有规则性,在 45 BC 之前,甚至不存在儒略历。
在格里高利历创立以前,新年是 3 月 25 日。为了避免混淆,此日历始终使用 1 月 1 日为新年。如果想要格里高利历转换之前并且处于 1 月 1 日和 3 月 24 日之间的日期,则可以进行手动调整。
为 WEEK_OF_YEAR
字段所计算的值的范围从 1 到 53。一年的第一个星期始于 getFirstDayOfWeek()
的最早 7 天,至少包含该年的 getMinimalDaysInFirstWeek()
各天。这取决于 getMinimalDaysInFirstWeek()
、getFirstDayOfWeek()
的值以及 1 月 1 日是星期几。一年的第一个星期和下一年的第一个星期之间的各个星期按顺序从 2 到 52 或 53(根据需要)进行编号。
例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek()
为 MONDAY
,并且 getMinimalDaysInFirstWeek()
为 4(这些值反映了 ISO 8601 和很多国家/地区标准),则 1998 年的第一个星期开始于 1997 年 12 月 29 日,结束于 1998 年 1 月 4 日。但是,如果 getFirstDayOfWeek()
为 SUNDAY
,那么 1998 年的第一个星期开始于 1998 年 1 月 4 日,结束于 1998 年 1 月 10 日;1998 年头三天是 1997 年第 53 个星期的一部分。
为 WEEK_OF_MONTH
字段所计算的值的范围从 0 到 6。一个月的第一个星期(WEEK_OF_MONTH = 1
的日期)是该月至少连续 getMinimalDaysInFirstWeek()
天中的最早日期,结束于 getFirstDayOfWeek()
的前一天。与一年的第一个星期不同,一个月的第一个星期可能短于 7 天,也不必从 getFirstDayOfWeek()
这一天开始,并且不包括前一个月的日期。在第一个星期之前该月日期的 WEEK_OF_MONTH
为 0。
例如,如果 getFirstDayOfWeek()
为 SUNDAY
,getMinimalDaysInFirstWeek()
为 4,那么 1998 年 1 月的第一个星期是从 1 月 4 日星期日到 1 月 10 日星期六。这些天的 WEEK_OF_MONTH
为 1。1 月 1 日星期四到 1 月 3 日星期六的 WEEK_OF_MONTH
为 0。如果 getMinimalDaysInFirstWeek()
变为 3,则 1 月 1 日到 1 月 3 日的 WEEK_OF_MONTH
为 1。
clear
方法将日历字段设置为未定义。GregorianCalendar
为每个日历字段使用以下默认值(如果该值未定义)。
字段 |
默认值 |
---|---|
ERA |
AD |
YEAR |
1970 |
MONTH |
JANUARY |
DAY_OF_MONTH |
1 |
DAY_OF_WEEK |
一个星期的第一天 |
WEEK_OF_MONTH |
0 |
DAY_OF_WEEK_IN_MONTH |
1 |
AM_PM |
AM |
HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND |
0 |
示例:
// get the supported ids for GMT-08:00 (Pacific Standard Time) String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000); // if no ids were returned, something is wrong. get out. if (ids.length == 0) System.exit(0); // begin output System.out.println("Current Time"); // create a Pacific Standard Time time zone SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]); // set up rules for daylight savings time pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); pdt.setEndRule(Calendar.0ctober, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); // create a GregorianCalendar with the Pacific Daylight time zone // and the current date and time Calendar calendar = new GregorianCalendar(pdt); Date trialTime = new Date(); calendar.setTime(trialTime); // print out a bunch of interesting things System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000))); System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000))); System.out.println("Current Time, with hour reset to 3"); calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override calendar.set(Calendar.HOUR, 3); System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // in hours System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000))); // in hours
字段摘要 | |
---|---|
static int |
AD ERA 字段的值指示公元后(耶稣纪元后)的时期(也称为 CE)。 |
static int |
BC ERA 字段的值指示公元前(Christ 前)的时期(也称为 BCE)。 |
从类 java.util.Calendar 继承的字段 |
---|
ALL_STYLES, AM, AM_PM, APRIL, areFieldsSet, AUGUST, DATE, DAY_OF_MONTH, DAY_OF_WEEK, DAY_OF_WEEK_IN_MONTH, DAY_OF_YEAR, DECEMBER, DST_OFFSET, ERA, FEBRUARY, FIELD_COUNT, fields, FRIDAY, HOUR, HOUR_OF_DAY, isSet, isTimeSet, JANUARY, JULY, JUNE, LONG, MARCH, MAY, MILLISECOND, MINUTE, MONDAY, MONTH, NOVEMBER, OCTOBER, PM, SATURDAY, SECOND, SEPTEMBER, SHORT, SUNDAY, THURSDAY, time, TUESDAY, UNDECIMBER, WEDNESDAY, WEEK_OF_MONTH, WEEK_OF_YEAR, YEAR, ZONE_OFFSET |
构造方法摘要 | |
---|---|
GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar 。 |
|
GregorianCalendar(int year, int month, int dayOfMonth) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar 。 |
|
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar 。 |
|
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。 |
|
GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar 。 |
|
GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar 。 |
|
GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar 。 |
方法摘要 | |
---|---|
void |
add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中。 |
Object |
clone() 创建并返回此对象的一个副本。 |
protected void |
computeFields() 将时间值(从 Epoch 至现在的毫秒偏移量)转换为日历字段值。 |
protected void |
computeTime() 将日历字段值转换为时间值(从 Epoch 至现在的毫秒偏移量)。 |
boolean |
equals(Object obj) 比较此 GregorianCalendar 与指定的 Object 。 |
int |
getActualMaximum(int field) 考虑到给定的时间值和 getFirstDayOfWeek 、getMinimalDaysInFirstWeek 、getGregorianChange 和 getTimeZone 方法的当前值,返回此日历字段可能具有的最大值。 |
int |
getActualMinimum(int field) 考虑到给定的时间值和 getFirstDayOfWeek 、getMinimalDaysInFirstWeek 、getGregorianChange 和 getTimeZone 方法的当前值,返回此日历字段可能具有的最小值。 |
int |
getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值。 |
Date |
getGregorianChange() 获得格里高利历的更改日期。 |
int |
getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值。 |
int |
getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值。 |
int |
getMinimum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最小值。 |
TimeZone |
getTimeZone() 获得时区。 |
int |
hashCode() 生成此 GregorianCalendar 对象的哈希码。 |
boolean |
isLeapYear(int year) 确定给定的年份是否为闰年。 |
void |
roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。 |
void |
roll(int field, int amount) 向指定日历字段添加有符号的时间量,不更改更大的字段。 |
void |
setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期。 |
void |
setTimeZone(TimeZone zone) 使用给定的时区值来设置时区。 |
从类 java.lang.Object 继承的方法 |
---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
字段详细信息 |
---|
public static final int BC
ERA
字段的值指示公元前(Christ 前)的时期(也称为 BCE)。从
BC
到
AD
各年转换依次是 2 BC、1 BC、1 AD、2 AD……。
Calendar.ERA
,
常量字段值
public static final int AD
ERA
字段的值指示公元后(耶稣纪元后)的时期(也称为 CE)。从
BC
到
AD
各年转换依次是 2 BC、1 BC、1 AD、2 AD……。
Calendar.ERA
,
常量字段值
构造方法详细信息 |
---|
public GregorianCalendar()
GregorianCalendar
。
public GregorianCalendar(TimeZone zone)
GregorianCalendar
。
zone
- 给定的时区。
public GregorianCalendar(Locale aLocale)
GregorianCalendar
。
aLocale
- 给定的语言环境。
public GregorianCalendar(TimeZone zone, Locale aLocale)
GregorianCalendar
。
zone
- 给定的时区。
aLocale
- 给定的语言环境。
public GregorianCalendar(int year, int month, int dayOfMonth)
GregorianCalendar
。
year
- 用来在日历中设置
YEAR
日历字段的值。
month
- 用来在日历中设置
MONTH
日历字段的值。Month 值是基于 0 的,例如,0 表示 1 月。
dayOfMonth
- 用来在日历中设置
DAY_OF_MONTH
日历字段的值。
public GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute)
GregorianCalendar
。
year
- 用来在日历中设置
YEAR
日历字段的值。
month
- 用来在日历中设置
MONTH
日历字段的值。Month 值是基于 0 的,例如,0 表示 1 月。
dayOfMonth
- 用来在日历中设置
DAY_OF_MONTH
日历字段的值。
hourOfDay
- 用来在日历中设置
HOUR_OF_DAY
日历字段的值。
minute
- 用来在日历中设置
MINUTE
日历字段的值。
public GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)
year
- 用来在日历中设置
YEAR
日历字段的值。
month
- 用来在日历中设置
MONTH
日历字段的值。Month 值是基于 0 的,例如,0 表示 1 月。
dayOfMonth
- 用来在日历中设置
DAY_OF_MONTH
日历字段的值。
hourOfDay
- 用来在日历中设置
HOUR_OF_DAY
日历字段的值。
minute
- 用来在日历中设置
MINUTE
日历字段的值。
second
- 用来在日历中设置
SECOND
日历字段的值。
方法详细信息 |
---|
public void setGregorianChange(Date date)
GregorianCalendar
的更改日期。这是发生从儒略历日期切换到格里高利历日期的点。默认时间是 1582 年 10 月 15 日(格里高利历)。在此之前,日期是按照儒略历计算的。
要得到纯粹的儒略历日历,可将更改日期设置为 Date(Long.MAX_VALUE)
。要得到一个纯粹的格里高利历日历,可将更改日期设置为 Date(Long.MIN_VALUE)
。
date
- 给定的格里高利历起始日期。
public final Date getGregorianChange()
GregorianCalendar
对象的格里高利历起始日期。
public boolean isLeapYear(int year)
true
。要指定 BC 年份,必须给定
1 - 年份
。例如,指定 -3 为 BC 4 年。
year
- 给定的年份。
true
;否则返回
false
。
public boolean equals(Object obj)
GregorianCalendar
与指定的
Object
。当且仅当参数是一个
GregorianCalendar
对象,并且这个对象表示在相同的
Calendar
参数和格里高利历更改日期下与此对象具有相同的时间值(从
Epoch 至现在的毫秒偏移量)时,结果为
true
。
obj
- 要与之比较的对象。
obj
,则返回
true
;否则返回
false
。
Calendar.compareTo(Calendar)
public int hashCode()
GregorianCalendar
对象的哈希码。
Object.equals(java.lang.Object)
,
Hashtable
public void add(int field, int amount)
添加规则 1。调用之后的 field
字段的值减去调用之前的 field
字段的值等于 amount
,以 field
中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,字段值被调整回其范围内。
添加规则 2。如果期望某一个更小的字段是无变化的,但让它等于以前的值是不可能的,因为在字段 field
发生更改之后,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR
是一个比 DAY_OF_MONTH
更小的字段。对于不期望是无变化字段的更小字段,无需进行任何调整。日历系统确定期望是无变化字段的那些字段。
field
- 日历字段。
amount
- 为字段添加的日期或时间量。
IllegalArgumentException
- 如果
field
为
ZONE_OFFSET
、
DST_OFFSET
,或未知,或者任何日历字段在 non-lenient 模式下具有超出范围的值。
Calendar.roll(int,int)
,
Calendar.set(int,int)
public void roll(int field, boolean up)
示例:考虑原来设置为 1999 年 12 月 31 日的 GregorianCalendar
。现在调用 roll(Calendar.MONTH, true)
将该日历设置为 1999 年 1 月 31 日。YEAR
字段未改变,因为它是一个比 MONTH
更大的字段。
up
- 指出指定日历字段的值是上升还是下降。如果上升了,则使用
true
;否则使用
false
。
field
- 时间字段。
IllegalArgumentException
- 如果
field
为
ZONE_OFFSET
、
DST_OFFSET
,或未知,或者任何日历字段在 non-lenient 模式下具有超出范围的值。
add(int,int)
,
Calendar.set(int,int)
public void roll(int field, int amount)
此方法在添加时间量前调用 Calendar.complete()
,使得所有的日历字段都标准化。如果任何日历字段在 non-lenient 模式下具有超出范围的值,则抛出 IllegalArgumentException
。
示例:考虑原来设置为 1999 年 8 月 31 日的 GregorianCalendar
。现在调用 roll(Calendar.MONTH, 8)
将该日历设置为 1999 年 4 月 30 日。如果使用 GregorianCalendar
,则 4 月份的 DAY_OF_MONTH
字段不可能为 31。将 DAY_OF_MONTH
设置为最可能接近的值 30。YEAR
字段保持为值 1999,因为它是一个比 MONTH
更大的字段。
示例:考虑原来设置为 1999 年 6 月 6 日星期日的 GregorianCalendar
。现在调用 roll(Calendar.WEEK_OF_MONTH, -1)
将该日历设置为 1999 年 6 月 1 日星期二,而调用 add(Calendar.WEEK_OF_MONTH, -1)
则将日历设置为 1999 年 5 月 30 日星期日。这是因为上升和下降规则施加了其他的约束:WEEK_OF_MONTH
改变时 MONTH
必须不变。根据添加规则 1,所得日期必定在 6 月 1 日星期二和 6 月 5 日星期六之间。根据添加规则 2,DAY_OF_WEEK
(在改变 WEEK_OF_MONTH
时它是一个不变量)被设置为 Tuesday,是最接近 Sunday 的可能值(其中星期日是一个星期的第一天)。
field
- 日历字段。
amount
- 添加到
field
的有符号时间量。
IllegalArgumentException
- 如果
field
为
ZONE_OFFSET
、
DST_OFFSET
或未知,或者任何日历字段在 non-lenient 模式下具有超出范围的值。
roll(int,boolean)
,
add(int,int)
,
Calendar.set(int,int)
public int getMinimum(int field)
GregorianCalendar
实例的给定日历字段的最小值。考虑到
getFirstDayOfWeek
、
getMinimalDaysInFirstWeek
、
getGregorianChange
和
getTimeZone
方法的当前值,最小值定义为由
get
方法为所有可能的时间值所返回的最小值。
Calendar
中的
getMinimum
field
- 日历字段。
getMaximum(int)
,
getGreatestMinimum(int)
,
getLeastMaximum(int)
,
getActualMinimum(int)
,
getActualMaximum(int)
public int getMaximum(int field)
GregorianCalendar
实例的给定日历字段的最大值。考虑到
getFirstDayOfWeek
、
getMinimalDaysInFirstWeek
、
getGregorianChange
和
getTimeZone
方法的当前值,最大值定义为
get
方法为所有可能的时间值所返回的最大值。
Calendar
中的
getMaximum
field
- 日历字段。
getMinimum(int)
,
getGreatestMinimum(int)
,
getLeastMaximum(int)
,
getActualMinimum(int)
,
getActualMaximum(int)
public int getGreatestMinimum(int field)
GregorianCalendar
实例给定日历字段的最高的最小值。考虑到
getFirstDayOfWeek
、
getMinimalDaysInFirstWeek
、
getGregorianChange
和
getTimeZone
方法的当前值,最高的最小值定义为
getActualMinimum(int)
为所有可能的时间值所返回的最大值。
Calendar
中的
getGreatestMinimum
field
- 日历字段。
getMinimum(int)
,
getMaximum(int)
,
getLeastMaximum(int)
,
getActualMinimum(int)
,
getActualMaximum(int)
public int getLeastMaximum(int field)
GregorianCalendar
实例给定日历字段的最低的最大值。考虑到
getFirstDayOfWeek
、
getMinimalDaysInFirstWeek
、
getGregorianChange
和
getTimeZone
方法的当前值,最低的最大值定义为
getActualMaximum(int)
为所有可能的时间值所返回的最小值。
Calendar
中的
getLeastMaximum
field
- 日历字段。
getMinimum(int)
,
getMaximum(int)
,
getGreatestMinimum(int)
,
getActualMinimum(int)
,
getActualMaximum(int)
public int getActualMinimum(int field)
getFirstDayOfWeek
、
getMinimalDaysInFirstWeek
、
getGregorianChange
和
getTimeZone
方法的当前值,返回此日历字段可能具有的最小值。
例如,如果格里高利历的更改日期是 1970 年 1 月 10 日,而此 GregorianCalendar
的日期是 1970 年 1 月 20 日,则 DAY_OF_MONTH
字段的实际最小值是 10,因为按照儒略历,1970 年 1 月 10 日的前一个日期是 1969 年 12 月 27 日。因此,从 1969 年 12 月 28 日到 1970 年 1 月 9 日的日期不存在。
Calendar
中的
getActualMinimum