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)一起探討!