複製鏈接
請複製以下鏈接發送給好友

GregorianCalendar

鎖定
GregorianCalendar是一個計算函數,是 Calendar 的一個具體子類,提供了世界上大多數國家/地區使用的標準日曆系統。是一種混合日曆,可由調用者通過調用 setGregorianChange() 來更改起始日期。
中文名
日曆
外文名
GregorianCalendar
性    質
Calendar 的一個具體子類
用    途
大多數國家使用的標準日曆系統
調    用
setGregorianChange() 更改日期

GregorianCalendarjava.util類 Calendar

java.lang.Object java.util.Calendar

GregorianCalendar所有已實現的接口

Serializable, Cloneable, Comparable<Calendar>

GregorianCalendar直接已知子類

GregorianCalendar

GregorianCalendar函數簡介

public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
Calendar 類是一個抽象類,它為特定瞬間與一組日曆字段(諸如YEAR、MONTH、DAY_OF_MONTH、HOUR等)之間的轉換提供了一些方法,併為操作日曆字段(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間 1970年1月1日的00:00:00.000,格里高利曆)的偏移量
該類還為實現包範圍外的具體日曆系統提供了其他字段和方法。這些字段和方法被定義為 protected。
與其他語言環境敏感類一樣,Calendar 提供了一個類方法 getInstance,以獲得此類型的一個通用的對象。
Calendar的getInstance()方法返回一個 Calendar 對象,其日曆字段已由當前日期和時間初始化:
Calendar rightNow = Calendar.getInstance();
Calendar 對象的方法會生成所有日曆字段值,為特定語言和日曆風格,實現不同的日期-時間格式化。
例如,日語-格里高裏歷,日語-傳統日曆。Calendar同時定義了某些日曆字段返回值的含義和範圍。例如,對於所有日曆,日曆系統第一個月的值是 MONTH == JANUARY。其他值是由具體子類(例如 ERA)定義的。相關細節請參閲每個字段的文檔和子類文檔。
獲得並設置日曆字段值可以通過調用 set 方法來設置日曆字段值。在需要計算時間值(距曆元所經過的毫秒)或日曆字段值之前,不會解釋 Calendar 中的所有字段值設置。調用 get、getTimeInMillis、getTime、add 和 roll 涉及此類計算。
寬鬆性Calendar 有兩種解釋日曆字段的模式,即lenient和non-lenient。當Calendar處於lenient模式時,它可接受比它所生成的日曆字段範圍更大範圍內的值。當Calendar重新計算日曆字段值,以便由get()返回這些值時,所有日曆字段都被標準化。
例如,
lenient模式下的GregorianCalendar將MONTH == JANUARY、DAY_OF_MONTH == 32 解釋 February 1。
當 Calendar 處於 non-lenient 模式時,如果其日曆字段中存在任何不一致性,它都會拋出一個異常。
例如,
GregorianCalendar 總是在1與月份的長度之間生成DAY_OF_MONTH 值。如果已經設置了任何超出範圍的字段值,那麼在計算時間或日曆字段值時,處於non-lenient模式下的GregorianCalendar會拋出一個異常。第一個星期Calendar使用兩個參數定義了特定於語言環境的7天制星期:星期的第一天和第一個星期中的最小一天(從1到7)。這些數字取自構造 Calendar 時的語言環境資源數據。還可以通過為其設置值的方法來顯式地指定它們。
在設置或獲得WEEK_OF_MONTH或WEEK_OF_YEAR字段時,Calendar必須確定一個月或一年的第一個星期,以此作為參考點。一個月或一年的第一個星期被確定為開始於getFirstDayOfWeek()的最早七天,它最少包含那一個月或一年的getMinimalDaysInFirstWeek()天數。第一個星期之前的各星期編號為 ...、-1、0;之後的星期編號為2、3、...。注意,get() 返回的標準化編號方式可能有所不同。例如,特定Calendar子類可能將某一年第1個星期之前的那個星期指定為前一年的第n個星期。日曆字段解析在計算日曆字段中的日期和時間時,可能沒有足夠的信息用於計算(例如只有年和月,但沒有日),或者可能有不一致的信息( 例如“Tuesday, July 15, 1996”(格林威治時間)——實際上,1996年7月15日是星期一)。Calendar將解析日曆字段值,以便用以下方式確定日期和時間。
如果日曆字段值中存在任何衝突,則 Calendar 將為最近設置的日曆字段提供優先權。以下是日曆字段的默認組合。將使用由最近設置的單個字段所確定的最近組合。
對於日期字段: YEAR + MONTH + DAY_OF_MONTH YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK YEAR + DAY_OF_YEAR YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
對於時間字段:
HOUR_OF_DAY AM_PM + HOUR
如果在選定的字段組合中,還有尚未設置值的任一日曆字段,那麼Calendar將使用其默認值。每個字段的默認值可能依據具體的日曆系統而有所不同。例如,在GregorianCalendar中,字段的默認值與曆元起始部分的字段值相同:即YEAR = 1970、MONTH = JANUARY、DAY_OF_MONTH = 1,等等.注:對於某些特別時間的解釋可能會有某些歧義,可以用下列方式解決: 23:59 是一天中的最後一分鐘,而 00:00 是下一天的第一分鐘。因此,1999年12月31日的23:59<2000年1月1日的00:00。儘管從歷史上看不夠精確,但午夜也屬於"am",中午屬於"pm",所以在同一天,12:00 am ( 午夜) < 12:01 am,12:00 pm ( 中午) < 12:01 pm。 日期或時間格式字符串不是日曆定義的一部分,因為在運行時,用户必須能夠修改或重寫它們。可以使用 DateFormat格式化日期。
字段操作
可以使用三種方法更改日曆字段:set()、add() 和 roll()。
set(f, value)將日曆字段 f 更改為 value。此外,它設置了一個內部成員變量,以指示日曆字段 f 已經被更改。儘管日曆字段 f 是立即更改的,但是直到下次調用 get()、getTime()、getTimeInMillis()、add() 或 roll() 時才會重新計算日曆的時間值(以毫秒為單位)。因此,多次調用 set() 不會觸發多次不必要的計算。使用 set() 更改日曆字段的結果是,其他日曆字段也可能發生更改,這取決於日曆字段、日曆字段值和日曆系統。此外,在重新計算日曆字段之後,get(f) 沒必要通過調用 set 方法返回 value 集合。具體細節是通過具體的日曆類確定的。
示例:
假定 GregorianCalendar 最初被設置為1999年8月31日。調用set(Calendar.MONTH, Calendar.SEPTEMBER)將該日期設置為1999年9月31日。如果隨後調用 getTime(),那麼這是解析 1999 年 10 月 1 日的一個暫時內部表示。但是,在調用 getTime() 之前調用 set(Calendar.DAY_OF_MONTH, 30) 會將該日期設置為 1999年9月30日,因為在調用set()之後沒有發生重新計算。
add(f, delta)將delta添加到f字段中。這等同於調用set(f, get(f) + delta),但要帶以下兩個調整:
Add 規則 1:
調用後 f 字段的值減去調用前 f 字段的值等於 delta,以字段 f 中發生的任何溢出為模。溢出發生在字段值超出其範圍時,結果,下一個更大的字段會遞增或遞減,並將字段值調整回其範圍內。
Add 規則 2:
如果期望某一個更小的字段是不變的,但讓它等於以前的值是不可能的,因為在字段 f 發生更改之後,或者在出現其他約束之後,比如時區偏移量發生更改,它的最大值和最小值也在發生更改,然後它的值被調整為儘量接近於所期望的值。更小的字段表示一個更小的時間單元。HOUR 是一個比DAY_OF_MONTH 小的字段。對於不期望是不變字段的更小字段,無需進行任何調整。日曆系統會確定期望不變的那些字段。
此外,與set()不同,add() 強迫日曆系統立即重新計算日曆的毫秒數和所有字段。
示例:假定GregorianCalendar最初被設置為1999年8月31日。調用add(Calendar.MONTH,13) 將日曆設置為2000年9月30日。規則1將MONTH字段設置為September,因為向August添加13個月得出的就是下一年的September。因為在GregorianCalendar中,DAY_OF_MONTH 不可能是9月31日,所以規則2將DAY_OF_MONTH設置為30,即最可能的值。儘管它是一個更小的字段,但不能根據規則2調整 DAY_OF_WEEK,因為在GregorianCalendar中的月份發生變化時,該值也需要發生變化。
roll(f, delta)將delta添加到f字段中,但不更改更大的字段。這等同於調用add(f, delta),但要帶以下調整:
Roll 規則。在完成調用後,更大的字段無變化。更大的字段表示一個更大的時間單元。DAY_OF_MONTH 是一個比 HOUR 大的字段。
示例:請參閲 GregorianCalendar.roll(int, int)。
使用模型。為了幫助理解 add() 和 roll() 的行為,假定有一個用户界面組件,它帶有用於月、日、年和底層 GregorianCalendar 的遞增或遞減按鈕。如果從界面上讀取的日期為 1999 年 1 月 31 日,並且用户按下月份的遞增按鈕,那麼應該得到什麼?如果底層實現使用 set(),那麼可以將該日期讀為 1999 年 3 月 3 日。更好的結果是 1999 年 2 月 28 日。此外,如果用户再次按下月份的遞增按鈕,那麼該日期應該讀為 1999 年 3 月 31 日,而不是 1999 年 3 月 28 日。通過保存原始日期並使用 add() 或 roll(),根據是否會影響更大的字段,用户界面可以像大多數用户所期望的那樣運行。

GregorianCalendar從以下版本開始

JDK1.1

GregorianCalendar另請參見

System.currentTimeMillis(), Date, GregorianCalendar, TimeZone, DateFormat, 序列化表格

GregorianCalendar函數概要

不管你是處理財務交易還是計劃着下一步的行動,你都要知道怎樣在Java中建立,使用和顯示日期。這需要你簡單的查閲一下相應類的API參考:一個日期可以創建3個相關類的對象。這篇文章告訴你你想要知道的內容。(3,000
本篇文章來源於:開發學院 http://edu. 原文鏈接:http://edu./2010/0531/23134_3.php
import java.util.*;
import java.text.*;
public class ParseExample {
public static void main(String[] args) {
String ds = "November 1, 2000";
DateFormat df = DateFormat.getDateInstance();
try {Date d = df.parse(ds);}
catch(ParseException e) {System.out.println("Unable to parse " + ds);}
在創建一個任意的日期時parse()方法很有用。我將通過另一種方法創建一個任意的日期。同時,你將看到怎樣進行基本日期計算,例如計算90天后的另一天。你可以使用GregorianCalendar類來完成這個任務。
GregorianCalendar類
創建一個代表任意日期的一個途徑使用GregorianCalendar類的構造函數,它包含在java.util包中:
GregorianCalendar(int year, int month, int date)
注意月份的表示,一月是0,二月是1,以此類推,是12月是11。因為大多數人習慣於使用單詞而不是使用數字來表示月份,這樣程序也許更易讀,父類Calendar使用常量來表示月份:JANUARY, FEBRUARY,等等。所以,創建Wilbur 和 Orville製造第一架動力飛機的日期(December 17, 1903),你可以使用:
GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
出於清楚的考慮,你應該使用前面的形式。但是,你也應該學習怎樣閲讀下面的短格式。下面的例子同樣表示December 17,1903(記住,在短格式中,11表示December)
GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17);
在上一節中,你學習了轉換Date對象到字符串。這裏,你可以做同樣的事情;但是首先,你需要將GregorianCalendar對象轉換到Date。要做到這一點,你可以使用getTime()方法,從它得父類Calendar繼承而來。GetTime()方法返回GregorianCalendar相應的Date對象。你能夠創建GregorianCalendar對象,轉換到Date對象,得到和輸出相應的字符串這樣一個過程。下面是例子:
import java.util.*;
import java.text.*;
public class Flight {
public static void main(String[] args) {
GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
Date d = firstFlight.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("First flight was " + s);
}
}