在平常的開發工做當中,咱們常常須要用到日期相關的類(包括日期類已經處理日期的類),因此,我就專門整理了一篇關於日期相關的類,但願能夠幫助到你們。java
在 Java 裏面,操做日期的類主要有如下幾個類:程序員
工具類 | 所屬包 | 繼承關係 | 實現接口 |
---|---|---|---|
Date類 | java.util包,須要導包 | 默認繼承Object | Serializable, Cloneable, Comparable |
SimpleDateFormat類 | java.text包,須要導包 | 繼承DateFormat | Serializable, Cloneable |
Calendar類 | java.util包,須要導包 | 默認繼承Object | Serializable, Cloneable, Comparable |
這是最基礎的一個日期類,其中Date類重名的有4個相關的類,這四個類所屬的包都不相同,這裏咱們講的是位於java.util包下的 Date 類。面試
Date 類有6個構造方法,其中後面5個帶有 @Deprecated 註解的都已經廢棄了(不推薦用),主要用的是前面2個構造方法。架構
public Date()複製代碼
public Date(long date) 複製代碼
@Deprecated
public Date(String s)複製代碼
@Deprecated
public Date(int year, int month, int date)複製代碼
@Deprecated
public Date(int year, int month, int date, int hrs, int min)複製代碼
@Deprecated
public Date(int year, int month, int date, int hrs, int min, int sec)複製代碼
既然有構造方法,其實咱們能夠經過new關鍵字實例化對象來獲取時間,經過源碼咱們能夠發現,無參構造方法實際上是用了 System.currentTimeMillis() 方法獲取當前系統時間而後經過方法調用將此時間傳遞給了 long 型有參方法進行私有成員變量賦值。工具
public Date() {
this(System.currentTimeMillis());
}
public Date(long date) {
fastTime = date;
}複製代碼
//返回當前系統時間與計算機元年()之間的毫秒值的差值
//計算機元年:1970-1-1 00:00:00
//中國時間差8個小時
long l = System.currentTimeMillis();
System.out.println(l);//1587349600847複製代碼
咱們能夠看到輸出 Date 輸出的格式是一個很奇怪的格式,不該該是 hashCode碼 嗎?其實不是,由於 Date 類重寫了 Object 的toString()方法,而後日期的格式是根據美國人的格式來命名輸出的,因此有點奇怪。學習
//輸出格式叫格格林威治時間格式
Date date = new Date();
System.out.println(date);//Mon Apr 20 10:33:49 CST 2020
//Date time = new Date("");複製代碼
Date 類裏面的方法也大部分都是廢棄的,不建議使用的,因此就介紹幾個經常使用的方法網站
Date date1 = new Date(1587350029179L);//前面時間
Date date2 = new Date(1587350029192L);//後面時間
boolean before = date1.before(date2);//判斷date1的時間是否在date2以前
System.out.println(before);//true複製代碼
Date date1 = new Date(1587350029179L);//前面時間
Date date2 = new Date(1587350029192L);//後面時間
boolean after = date1.after(date2);//判斷date1的時間是否在date2以後
System.out.println(after);//false複製代碼
如今咱們經過上面講的日期類,能夠操做時間了,可是時間的輸出格式是格林威治時間,時間格式很不直觀,並且還很奇怪,那麼有沒有什麼辦法能夠去上輸出的時間變成咱們常見的年月日時分秒的時間格式呢?答案固然是能夠,Jdk 給咱們提供了操做時間格式的工具類 DateFormat,可是咱們看源碼發現,如圖所示this
public abstract class DateFormat extends Format{}複製代碼
此類實際上是一個抽象類,咱們都知道,抽象類是不能經過構造方法建立對象,不能實例化的,通俗的講就是不能作事情的,那麼咱們能夠找抽象類的子類,而後幫咱們去格式化Date日期,這個類就是SimpleDateFormat類。spa
SimpleDateFormat 類有4個構造方法,以下方代碼:3d
public SimpleDateFormat(){}複製代碼
public SimpleDateFormat(String pattern){}複製代碼
public SimpleDateFormat(String pattern, Locale locale){}複製代碼
public SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols){}複製代碼
下面這張圖表示了日期的模式,其中大寫的M表示一年中的第幾月,小寫的m表示時分秒的分;大寫的D是一年當中的第幾天,小寫的d是一個月中的第幾天;大寫的H表示Hour in day (0-23),小寫的h Hour in am/pm (1-12);大寫的S表示毫秒,小寫的s表示秒,每一個具體的含義能夠參考下圖:
DateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf1.format(new Date()));//2020-04-20 11:40:18複製代碼
DateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = "2012-10-20";
Date parse = null;
try {
parse = sdf1.parse(dateStr);
System.out.println(parse);//Sat Oct 20 00:00:00 CST 2012
} catch (ParseException e) {
e.printStackTrace();
}複製代碼
因爲 Date 類裏面的不少方法都是廢棄了的(JDK不建議咱們使用),Date 不能只操做年或月或日,因此就出現了Calendar 類,Calendar英文單詞是日曆的意思,Calendar 類雖然也是一個抽象類,可是能夠 getInstance()方法得到 Calendar 對象,
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {}複製代碼
其實你能夠這樣理解,Calendar類是Date類的增強版(升級版),Date類能夠作的事情,Calendar類都能作。
Calendar類的兩個構造方法都是protected關鍵字修飾的,是訪問不到的,只有子類才能夠訪問
protected Calendar(){}複製代碼
protected Calendar(TimeZone zone, Locale aLocale){}複製代碼
Calendar calendar = Calendar.getInstance();複製代碼
setTime()方法,使用給定的Date設置日曆的時間。
getTime()方法,獲取時間日期,返回一個Date
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());//Mon Apr 20 13:48:10 CST 2020複製代碼
Calendar calendar = Calendar.getInstance();
TimeZone timeZone = calendar.getTimeZone();
System.out.println(timeZone.getID());//Asia/Shanghai
System.out.println(timeZone.getDisplayName());//中國標準時間複製代碼
以上就是我關於日期相關類的總結,小夥伴們若是有任何問題歡迎留言哦~~
最後,最近不少小夥伴找我要Linux學習路線圖,因而我根據本身的經驗,利用業餘時間熬夜肝了一個月,整理了一份電子書。不管你是面試仍是自我提高,相信都會對你有幫助!目錄以下:
免費送給你們,只求你們金指給我點個贊!
也但願有小夥伴能加入我,把這份電子書作得更完美!
推薦閱讀: