在日常的開發(fā)工作當(dāng)中,我們經(jīng)常需要用到日期相關(guān)的類(包括日期類已經(jīng)處理日期的類),所以,我就專門整理了一篇關(guān)于日期相關(guān)的類,希望可以幫助到大家。
在 Java 里面,操作日期的類主要有以下幾個類:
工具類 | 所屬包 | 繼承關(guān)系 | 實(shí)現(xiàn)接口 |
---|---|---|---|
Date類 | java.util包,需要導(dǎo)包 | 默認(rèn)繼承Object | Serializable, Cloneable, Comparable |
SimpleDateFormat類 | java.text包,需要導(dǎo)包 | 繼承DateFormat | Serializable, Cloneable |
Calendar類 | java.util包,需要導(dǎo)包 | 默認(rèn)繼承Object | Serializable, Cloneable, Comparable |
這是最基礎(chǔ)的一個日期類,其中Date類重名的有4個相關(guān)的類,這四個類所屬的包都不相同,這里我們講的是位于java.util包下的 Date 類。
Date 類有6個構(gòu)造方法,其中后面5個帶有 @Deprecated 注解的都已經(jīng)廢棄了(不推薦用),主要用的是前面2個構(gòu)造方法。
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)
既然有構(gòu)造方法,其實(shí)我們可以通過new關(guān)鍵字實(shí)例化對象來獲取時間,通過源碼我們可以發(fā)現(xiàn),無參構(gòu)造方法其實(shí)是用了 System.currentTimeMillis() 方法獲取當(dāng)前系統(tǒng)時間然后通過方法調(diào)用將此時間傳遞給了 long 型有參方法進(jìn)行私有成員變量賦值。
public Date() {
this(System.currentTimeMillis());
}
public Date(long date) {
fastTime = date;
}
//返回當(dāng)前系統(tǒng)時間與計算機(jī)元年()之間的毫秒值的差值
//計算機(jī)元年:1970-1-1 00:00:00
//中國時間差8個小時
long l = System.currentTimeMillis();
System.out.println(l);//1587349600847
我們可以看到輸出 Date 輸出的格式是一個很奇怪的格式,不應(yīng)該是 hashCode碼 嗎?其實(shí)不是,因?yàn)?Date 類重寫了 Object 的toString()方法,然后日期的格式是根據(jù)美國人的格式來命名輸出的,所以有點(diǎn)奇怪。
//輸出格式叫格格林威治時間格式
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
現(xiàn)在我們通過上面講的日期類,可以操作時間了,但是時間的輸出格式是格林威治時間,時間格式很不直觀,而且還很奇怪,那么有沒有什么辦法可以去上輸出的時間變成我們常見的年月日時分秒的時間格式呢?答案當(dāng)然是可以,Jdk 給我們提供了操作時間格式的工具類 DateFormat,但是我們看源碼發(fā)現(xiàn),如圖所示
public abstract class DateFormat extends Format{}
此類其實(shí)是一個抽象類,我們都知道,抽象類是不能通過構(gòu)造方法創(chuàng)建對象,不能實(shí)例化的,通俗的講就是不能做事情的,那么我們可以找抽象類的子類,然后幫我們?nèi)ジ袷交疍ate日期,這個類就是SimpleDateFormat類。
SimpleDateFormat 類有4個構(gòu)造方法,如下方代碼:
public SimpleDateFormat(){}
public SimpleDateFormat(String pattern){}
public SimpleDateFormat(String pattern, Locale locale){}
public SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols){}
下面這張圖表示了日期的模式,其中大寫的M表示一年中的第幾月,小寫的m表示時分秒的分;大寫的D是一年當(dāng)中的第幾天,小寫的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 不能只操作年或月或日,所以就出現(xiàn)了Calendar 類,Calendar英文單詞是日歷的意思,Calendar 類雖然也是一個抽象類,但是可以 getInstance()方法獲得 Calendar 對象,
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {}
其實(shí)你可以這樣理解,Calendar類是Date類的加強(qiáng)版(升級版),Date類可以做的事情,Calendar類都能做。
Calendar類的兩個構(gòu)造方法都是protected關(guān)鍵字修飾的,是訪問不到的,只有子類才可以訪問
protected Calendar(){}
protected Calendar(TimeZone zone, Locale aLocale){}
Calendar calendar = Calendar.getInstance();
setTime()方法,使用給定的Date設(shè)置日歷的時間。
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());//中國標(biāo)準(zhǔn)時間
以上就是我關(guān)于日期相關(guān)類的總結(jié),小伙伴們?nèi)绻腥魏螁栴}歡迎留言哦~~
公眾號:良許Linux