JAVA8時(shí)間操作總結(jié)

Java8處理日期總結(jié)

Java8對(duì)lambda、streams做了優(yōu)化,也推出了全新的處理時(shí)間API棋蚌,明確了時(shí)間概念,如:instant(瞬時(shí))峭弟,duration(長(zhǎng)短)附鸽、日期、時(shí)間瞒瘸、時(shí)區(qū)和周期,和老版本不同的是坷备,新的API是以IOS為標(biāo)準(zhǔn)日歷系統(tǒng)的,java.time下的所有類都是線程安全的情臭。

關(guān)鍵API

  • ZonedDateTime:最完整的日期和時(shí)間省撑,包含有相對(duì)UTC和時(shí)區(qū)已經(jīng)格林威治時(shí)差。
  • LocalDateTime:不包含時(shí)差和時(shí)區(qū)信息俯在。
  • LocalTime:包含時(shí)間竟秫,但是沒(méi)有日期。
  • LocalDate:當(dāng)?shù)厝掌邗卫郑话唧w時(shí)間肥败。
  • Instant:瞬時(shí)實(shí)例。

代碼實(shí)現(xiàn)

主要通過(guò)一些簡(jiǎn)單的代碼實(shí)例去學(xué)校Java8中的時(shí)間API愕提,只有項(xiàng)目才是學(xué)習(xí)新知識(shí)最有效的方式馒稍。

使用LocalDate獲取當(dāng)前時(shí)間已經(jīng)年、月浅侨、日信息

LocalDate表示當(dāng)前本地的時(shí)間纽谒,但是只包含日期,沒(méi)有時(shí)間

??/**
?????*?獲取當(dāng)前時(shí)間已經(jīng)年月日信息
?????*/
????public?static?void?getNowDate(){
????????//只獲取日期
????????LocalDate?now?=?LocalDate.now();
????????System.out.println("本地時(shí)間只有年月日:"+now);
????????Date?date?=?new?Date();
????????System.out.println("Java.Util.Date獲取時(shí)間:"+date);
????????int?year?=?now.getYear();
????????int?monthValue?=?now.getMonthValue();
????????int?dayOfMonth?=?now.getDayOfMonth();
????????System.out.printf("年?:?%d??月?:?%d??日?:?%d?t?%n",year,monthValue,dayOfMonth);

????}

結(jié)果

本地時(shí)間只有年月日:2021-01-26
Java.Util.Date獲取時(shí)間:Tue?Jan?26?21:33:07?CST?2021
年?:?2021??月?:?1??日?:?26?t?

使用LocalDate獲取特定時(shí)間

LocalDate.of()可以創(chuàng)建任意時(shí)間如输,只有輸入年月日參數(shù)即可鼓黔,不像之前的Java API起始時(shí)間是1900央勒,月份從0開(kāi)始。

????/**
?????*?處理特點(diǎn)的時(shí)間根據(jù)年月日
?????*?@param?year
?????*?@param?month
?????*?@param?day
?????*/
????public?static?void?setSpecilDate(int?year,int?month,int?day)?{
????????LocalDate?date?=?LocalDate.of(year,?month,?day);
????????System.out.println("設(shè)置時(shí)間為?:"+date);
????}

結(jié)果

設(shè)置時(shí)間為?:2021-1-26

使用equals判斷兩個(gè)日期是否相等

在現(xiàn)實(shí)項(xiàng)目中進(jìn)程會(huì)遇到判斷兩個(gè)日期是否相等澳化,LocalDate重載了 equal方法使得她們可以進(jìn)行比較

?/**
?????*?判斷兩個(gè)日期是否equals
?????*/
????public?static?void?compareLocalDate(){
????????LocalDate?now?=?LocalDate.now();
????????LocalDate?date?=?LocalDate.of(2020,?12,?26);

????????boolean?equals?=?now.equals(date);
????????String?result?=equals?"相等":"不相等";
????????System.out.printf("時(shí)間now?%s?和?時(shí)間date?%s??%s?\n",?now,?date,result);
????}

結(jié)果

時(shí)間now?2021-1-26?和?時(shí)間date?2021-1-26??相等?

使用MonthDay檢查年周期性時(shí)間

在實(shí)際項(xiàng)目中崔步,我們經(jīng)常會(huì)遇到一些周期性的事件,例如生日缎谷、結(jié)婚紀(jì)念日或者每月定時(shí)給客戶發(fā)送郵件等事件刷晋,在Java8中使用MonthDay類,實(shí)現(xiàn)了月份和日的組合慎陵,這樣就可以判斷每年都會(huì)發(fā)生的事件了

????/**
?????*?處理一年只發(fā)生一次的事情
?????*/
????public?static?void?cycleDate(){
????????//獲取當(dāng)前時(shí)間
????????LocalDate?now?=?LocalDate.now();
????????//設(shè)置特點(diǎn)時(shí)間
????????LocalDate?date?=?LocalDate.of(2020,?1,?26);
????????//獲取月份和日期
????????MonthDay?monthDay?=?MonthDay.of(date.getMonth(),?date.getDayOfMonth());
????????//獲取當(dāng)前時(shí)間的月份和日期
????????MonthDay?currentDay?=?MonthDay.from(now);
????????String?equals?=?currentDay.equals(monthDay)?"是":"不是";
????????System.out.printf("時(shí)間now?%s?和?時(shí)間date?%s??%s?周期循環(huán)日?\n",?now,?date,equals);
????}

結(jié)果

時(shí)間now?2021-01-26?和?時(shí)間date?2020-01-26??是?周期循環(huán)日?

使用LocalTime獲取當(dāng)前時(shí)間(只有時(shí)間沒(méi)有年月日),已經(jīng)對(duì)時(shí)間進(jìn)行加減操作

LocalTime可是使用靜態(tài)工廠方法LocalTime.now()獲取當(dāng)前時(shí)間喻奥。默認(rèn)格式是hh:mm:ss:nm席纽。

????/**
?????*?對(duì)時(shí)間進(jìn)行加減操作
?????*/
????public?static?void?operatDate(){

????????LocalTime?localTime?=?LocalTime.now();
????????LocalTime?time?=?localTime.plusHours(-1).plusMinutes(1).plusSeconds(30);
????????System.out.printf("當(dāng)前時(shí)間是?%s?和?加減操作后的時(shí)間?%s??\n",?localTime,?time);
????}

結(jié)果

當(dāng)前時(shí)間是?22:03:52.522?和?加減操作后的時(shí)間?21:05:22.522??

計(jì)算N周、N月或者N年前撞蚕、后的日期

??/**
?????*?對(duì)LocalDate時(shí)間進(jìn)行加減操作
?????*/
????public?static?void?operatLocalDateDate(){

????????LocalDate?today?=?LocalDate.now();
????????LocalDate?previousYear?=?today.plusYears(-1).plusMonths(1).plusDays(1).plusWeeks(-1);

????????LocalDate?previousYear1?=?today.minusYears(1).plusMonths(1).plusDays(1).minusWeeks(1);
????????String?result?=previousYear.equals(previousYear1)?"相等":"不相等";
????????System.out.printf("previousYear時(shí)間?%s?和?previousYear1時(shí)間??%s??%s?\n",?previousYear,?previousYear1,result);

????}

結(jié)果:可見(jiàn)不同的操作有相同的結(jié)果润梯,對(duì)時(shí)間進(jìn)行操作要多思考

previousYear時(shí)間?2020-02-20?和?previousYear1時(shí)間??2020-02-20??相等?

判斷連個(gè)日期的早晚

在LocalDate中包含isBefore()和isAfter比較日期比較

/**
?????*?判斷兩個(gè)日期的早晚
?????*/
?public??static??void?isBeforeOrAfter(){
?????LocalDate?now?=?LocalDate.now();
?????LocalDate?plusDays?=?now.plusDays(1);

?????String?beforeSrt?=?now.isBefore(plusDays)?"是":"不是";
?????String?afterSrt?=?plusDays.isAfter(now)?"是":"不是";


?????System.out.printf("時(shí)間?%s?%s??在時(shí)間??%s??之前?\n",now,?beforeSrt,?plusDays);
?????System.out.printf("時(shí)間?%s?%s??在時(shí)間??%s??之后?\n",plusDays,?afterSrt,?now);

?}

結(jié)果

時(shí)間?2021-01-26?是??在時(shí)間??2021-01-27??之前?
時(shí)間?2021-01-27?是??在時(shí)間??2021-01-26??之后?

使用Period計(jì)算兩個(gè)日期之間的天數(shù)和月數(shù)

???/**
?????*?計(jì)算日期相差天數(shù)和月數(shù)
?????*/
?public??static?void?clacDateDays(){
?????LocalDate?now?=?LocalDate.now();

?????LocalDate?plusMonths?=?now.plusMonths(2).plusDays(-1);
?????Period?between?=?Period.between(now,?plusMonths);

?????System.out.printf("時(shí)間?%s?和時(shí)間??%s??相差?%s?月???%s天?\n",now,?plusMonths,between.getMonths(),?between.getDays());

?}

結(jié)果

時(shí)間?2021-01-26?和時(shí)間??2021-03-25??相差?1?月???27天?

獲取時(shí)間戳

????/**
?????*?獲取時(shí)間戳
?????*/
????public??static?void?getTimestamp(){
????????Instant?now?=?Instant.now();
????????System.out.println(now);
????}

總結(jié):

今天介紹Java8中日期和是時(shí)間API,主要介紹了LocalDate和LocalTime類甥厦,這些API都是線程安全的纺铭,而Date和Calendr類都是 是非線程安全的,介紹的可能不是很全還請(qǐng)一起探討!


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刀疙,一起剝皮案震驚了整個(gè)濱河市舶赔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谦秧,老刑警劉巖竟纳,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疚鲤,居然都是意外死亡锥累,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)集歇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桶略,“玉大人,你說(shuō)我怎么就攤上這事诲宇〖始撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵焕窝,是天一觀的道長(zhǎng)蹬挺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)它掂,這世上最難降的妖魔是什么巴帮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任溯泣,我火速辦了婚禮,結(jié)果婚禮上榕茧,老公的妹妹穿的比我還像新娘垃沦。我一直安慰自己,他們只是感情好用押,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布肢簿。 她就那樣靜靜地躺著,像睡著了一般蜻拨。 火紅的嫁衣襯著肌膚如雪池充。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天缎讼,我揣著相機(jī)與錄音收夸,去河邊找鬼。 笑死血崭,一個(gè)胖子當(dāng)著我的面吹牛卧惜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夹纫,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咽瓷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舰讹?” 一聲冷哼從身側(cè)響起茅姜,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跺涤,沒(méi)想到半個(gè)月后匈睁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桶错,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年航唆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片院刁。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糯钙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出退腥,到底是詐尸還是另有隱情任岸,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布狡刘,位于F島的核電站享潜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅蔬。R本人自食惡果不足惜剑按,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一疾就、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艺蝴,春花似錦猬腰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缩擂,卻和暖如春鼠冕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胯盯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工供鸠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨闹。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薄坏,于是被迫代替她去往敵國(guó)和親趋厉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容