Java日期時間API系列3-----Jdk7及之前的日期時間類的不方便使用問題

使用Java日期時間類,每一個人都很熟悉每一個項目中必不可少的工具類就是dateutil,包含各類日期計算,格式化等處理,並且經常會遇到找不到可用的處理方法,須要本身新增方法,處理過程很複雜。html

1.Date中的過期方法等

Date中的方法通常都過期了,不建議使用,有一些歧義。好比:java

(1)new Date(2019,01,01)實際是3919年2月。由於Date的構造函數 的年份表示的始於1900年的差值。sql

(2)month是從0開始的。函數

(3)Date若是不格式化,打印出的日期可讀性差。工具

Fri Dec 13 23:08:12 CST 2019

(4)Date和java.sql.Date命名徹底同樣,不易區分。spa

2 Calendar操做繁瑣、不支持複雜計算等

Calendar雖然可以處理大部分的Date計算,但設計不是很成功,一些簡單操做都要屢次調用。對一些複雜的計算好比兩個日期之間有多少個月,生日計算年齡等都不支持。好比:設計

(1)DAY_OF_WEEK 的取值,是從週日(1)開始的。code

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));

(2)MONTH 的取值,是從0開始的。htm

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        System.out.println(calendar.get(Calendar.MONTH));

(3)set()方法延遲修改blog

經過set()方法設置某一個字段的值得時候,該字段的值不會立馬修改,直到下次調用get()、getTime()等時纔會從新計算日曆的時間。延遲修改的優點是屢次調用set()方法不會觸發屢次沒必要要的計算。下面程序演示了set()方法延遲修改的效果:

Calendar cal = Calendar.getInstance();
cal.set(2003,7,31);//2003-8-31
//將月份設爲9,但9月31不存在
//若是當即修改,系統會把cal自動調整到10月1日
cal.set(Calendar.MONTH,8);
//下面代碼輸出了10月1日
System.out.println(cal.getTime());//(1)
//設置DATE字段爲5
cal.set(Calendar.DATE, 5);//(2)
System.out.println(cal.getTime());//(3)

打印結果爲:

Wed Oct 01 22:25:41 CST 2003
Sun Oct 05 22:25:41 CST 2003

若是將(1)處的代碼註釋掉,打印結果爲:

Fri Sep 05 22:28:06 CST 2003

你看明白了嗎?若是將(1)處的代碼註釋掉,由於set()方法具備延遲性,它內部只是先記錄下MONTH字段的值爲8,接着程序將DATE字段設置爲5,程序內部再次記錄DATE字段的值爲5——就是9月5日。

3.日期類並不提供國際化,沒有時區支持,所以Java引入了java.util.Calendar和java.util.TimeZone類,但他們一樣存在上述全部的問題。

 

參考:https://www.jianshu.com/p/1478af429a1e

      https://www.cnblogs.com/bingyimeiling/p/10420752.html

相關文章
相關標籤/搜索