每日一例 | 你真的了解日期時(shí)間類嗎?
前言
日期和時(shí)間是我們?cè)谌粘i_發(fā)中經(jīng)常用到的數(shù)據(jù)類型,但是很多時(shí)候我們獲取日期和時(shí)間的方式并不合理,特別是在多線程環(huán)境中會(huì)有一些問題,為了能夠更合理地使用他們,我們首先要了解他們的常用方法和基本用法,今天我們就來看下如何合理地獲取日期時(shí)間。
Date
date這個(gè)類,是我們?nèi)粘+@取日期時(shí)間最主要的類,也是我們比較熟悉的類,常用的構(gòu)造方法有很多,但絕大部分以及被棄用了:


接下來,我們就來看下這些沒有被棄用的方法的常用用法。
構(gòu)造方法
目前可以用的構(gòu)造方法有兩個(gè),Date()和Date(long date),從源碼來看,第一個(gè)構(gòu)造方法調(diào)用了第二個(gè)構(gòu)造方法:

常用方法
getTime()
獲取當(dāng)前日期的毫秒時(shí)間。根據(jù)構(gòu)造方法的描述,java日期時(shí)間的起點(diǎn)是1970-01-01 00:00:00,所以獲取1970-01-01 00:00:00的毫秒時(shí)間的值應(yīng)該是0,但由于它指定的時(shí)區(qū)是GMT,也就是零時(shí)區(qū),中國位于東八區(qū)(GMT+8),所以在不指定時(shí)區(qū)的情況下,在中國直接獲取的時(shí)間毫秒并不是0,而是負(fù)8小時(shí)的毫秒數(shù),也就是-28800000
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date parse = dateFormat.parse("1970-01-01 00:00:00 GMT");
System.out.println(parse.getTime());
System.out.println(new Date().getTime());
輸出結(jié)果:

setTime()
這個(gè)方法就是設(shè)定日期的毫秒時(shí)間。setTime(0),就是1970-01-01 00:00:00。這里的時(shí)間指的就是當(dāng)前時(shí)區(qū)的時(shí)間。
Date x = new Date();
x.setTime(0);
System.out.println(x);
結(jié)果:
Thu Jan 01 08:00:00 CST 1970
before()
咋感覺像是發(fā)現(xiàn)新大陸了呢?實(shí)話實(shí)說,以前比較實(shí)際先后順序都是自己手動(dòng)寫,第一次發(fā)現(xiàn)官方已經(jīng)提供了。
Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.before(date2));
返回結(jié)果:
true
當(dāng)然,你也可以自己寫,也很簡(jiǎn)單,但是用現(xiàn)成的,它不香嗎?
after()
剛好和before相反,實(shí)現(xiàn)方法也就是小于改成大于。
Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.after(date2));
返回結(jié)果
flase
equals
這里它重寫了equals方法,比較的是兩個(gè)日期的毫秒時(shí)間

Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.equals(date2));
返回結(jié)果false
compareTo
比較兩個(gè)日期,如果當(dāng)前日期小于傳入的日期,返回-1,如果兩個(gè)日期時(shí)間相等,返回0,否則返回1

Date date3 = new Date();
Date date4 = new Date(date1.getTime() + 5);
System.out.println(date3.compareTo(date4));
返回-1
from
這個(gè)方法是jdk1.8引入的一個(gè)方法,它是一個(gè)靜態(tài)方法,方法的作用是從Instant對(duì)象中獲取日期時(shí)間,Instant類也是jdk1.8引入的一個(gè)類,它是一個(gè)final類,jdk1.8還有一個(gè)不太為人所知的特性就是加強(qiáng)了對(duì)日期時(shí)間的支持。
Instant instant = Instant.now();
System.out.println(Date.from(instant));
輸出結(jié)果:
Sat May 22 11:27:15 CST 2021
toInstant
這個(gè)方法同樣是jdk1.8引入的,作用和from剛好相反。但這個(gè)方法并非靜態(tài)方法。
Instant instant1 = date1.toInstant();
System.out.println(instant1);
輸出結(jié)果
2021-05-22T03:30:20.977Z
Date類到這里就結(jié)束了。
總結(jié)
鑒于時(shí)間的關(guān)系,今天我們就到這里吧。今天我們就分享了Date類常用的一些方法和用法,確實(shí)也get到兩個(gè)我以前不知道的知識(shí)點(diǎn),對(duì),就是before和after,而且我也確認(rèn)了不是jdk1.8新增的方法,你學(xué)到了嗎?
另外再補(bǔ)充下,未來一段時(shí)間,我打算繼續(xù)挖掘jdk1.8對(duì)于日期時(shí)間增強(qiáng)的一些知識(shí)點(diǎn),發(fā)現(xiàn)這里的知識(shí)點(diǎn)還是蠻多的,這里先做一個(gè)簡(jiǎn)單的預(yù)告,未來持續(xù)更新:
format相關(guān)的類枚舉類:
DayOfWeek、Month其他常用的類:
Clock、Duration、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Period、Ser、Year、YearMonth、ZonedDateTime、ZoneId、ZoneOffset、ZoneRegion
一梳理,發(fā)現(xiàn)涉及的內(nèi)容還是蠻多的,不過沒關(guān)系,我們來日方長(zhǎng)……加油!
項(xiàng)目路徑:
https://github.com/Syske/example-everyday
本項(xiàng)目會(huì)每日更新,讓我們一起學(xué)習(xí),一起進(jìn)步,遇見更好的自己,加油呀
- END -