java日期操作專題

1、時間日期

1)java中的時間類有:DateCalendar

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) 
根據日曆的規則,爲給定的日曆字段添加或減去指定的時間量。
3、設定某個field的值

void set(int field, int value)
將給定的日曆字段設置爲給定值。
4、取得某個field的值

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 規則 1MONTH 字段設置爲 September,因爲向 August 添加 13 個月得出的就是下一年的 September。因爲在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9 月 31 日,所以 add 規則 2DAY_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 格式化爲日期/時間字符串。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章