1)java中的時間類有:Date和Calendar
3) 時間的標準有兩種
(1970)GMT long
(0)UTC long
4) java中基本的時間表示GMT long
5) java提供了Date類型表示時間和日期
Date 是long 類型的包裝
6) Calendar 是曆法的抽象
曆法:公曆,農曆,太陽曆
7) GregorianCalendar是曆法的實現,採用公曆的算法實現的
Calendar cal = Calendar.getInstance();
Calendar cal = new GregorianCalendar();//除了日本和泰國,效果等同於上一句
8) Date和 Calendar的默認值就是系統當前時間
所以在對日期操作時,基本選的 Calendar類(抽象類),
Calendar
cal = Calendar.getInstance();//得到一個Calendar類的實例
Date nowTime = cal.getTime();//當前時間
1、將Date類型的日期,得到其Calendar對象
void |
setTime(Date date) 使用給定的 Date 設置此 Calendar 的時間。 |
2、對日期加減等運算,用Calendar非常方便.只要對calendar對象中的相應field比較熟悉,(包括對某個日期,年、月、日、時、分、秒的操作)
abstract void |
add(int field, int amount) 根據日曆的規則,爲給定的日曆字段添加或減去指定的時間量。 |
void |
set(int field, int value) 將給定的日曆字段設置爲給定值。 |
int |
get(int field) 返回給定日曆字段的值。 |
以下列出常用的對field的操作。方便的去得某個Date對應的年、月(從0開始)、日、時、分、秒、毫秒等。
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
System.out.println(calendar.get(Calendar.ERA));
System.out.println(calendar.get(Calendar.YEAR));
//calendar.set(Calendar.YEAR, 2014);
//calendar.set(Calendar.MONTH, 2);//1月爲0 2月爲1..依次類推
//calendar.set(Calendar.DATE, 31);
System.out.println("------日期相關------");
System.out.println(calendar.get(Calendar.YEAR));//年
System.out.println(calendar.get(Calendar.MONTH));//月 0 爲1月,1爲2月 ,2爲3月
System.out.println(calendar.get(Calendar.DATE));//日此月的第幾天,第一天爲1
System.out.println(calendar.get(Calendar.HOUR));//時
System.out.println(calendar.get(Calendar.MINUTE));//分
System.out.println(calendar.get(Calendar.SECOND));//秒
System.out.println(calendar.get(Calendar.MILLISECOND));//毫秒
System.out.println("------------");
System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println(calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("------------");
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//與DATE同義
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//返回當前日期是一週的第幾天,週日爲第一天
System.out.println(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));//一個月的第幾周
System.out.println("-----------");
System.out.println(calendar.get(Calendar.AM_PM));//
System.out.println("-----------");
System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, new Locale("en")));//
System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()));//
System.out.println(calendar.getTime());
System.out.println(new Date());
calendar.set(Calendar.DATE,30);
calendar.add(Calendar.DATE, -3);//calendar代表的日期-3天
calendar.add(Calendar.DATE, 3);//calendar代表的日期+3天,超過當前月自動順延到下月
System.out.println(calendar.getTime());
字段操作(摘自 JDK文檔,項目中遇到過此類bug,所以拿出來單獨說明)
可以使用三種方法更改日曆字段: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 日。Add 規則 1 將
MONTH
字段設置爲 September,因爲向 August 添加 13 個月得出的就是下一年的 September。因爲在
GregorianCalendar
中,DAY_OF_MONTH
不可能是 9 月 31 日,所以 add 規則 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()
,根據是否會影響更大的字段,用戶界面可以像大多數用戶所期望的那樣運行。
注意以上區別避免出現錯誤。
DateFormat類
DateFormat是對日期和時間格式化的一個抽象,提供日期的格式化與解析
常用操作:
將字符串轉解析爲日期(字符串----》日期)(然後再得到對應的Calendar實例,就可以用此操作格式化的日期了)
Date |
parse(String source) 從給定字符串的開始解析文本,以生成一個日期。 |
將日期轉換爲字符串(日期----》》》字符串)
String |
format(Date date) 將一個 Date 格式化爲日期/時間字符串。 |