Java 8中處理日期和時間示例

在Java 8以前辑畦,日期和時間處理一直被廣大java程序員抱怨太難用匣砖,首先是java.utiljava.sql中,都包含Date類煞烫,如果要進行時間格式化浑此,還需要java.text.DateFormat類處理。同時java.util.Date中既包含了日期滞详,又包含了時間凛俱,所以java8新的日期和時間庫紊馏,很好的解決了以前日期和時間類的很多弊端。并且也借鑒了第三方日期庫joda很多的優(yōu)點蒲犬。

在java8中朱监,java.time包下主要包含下面幾個主要的類:

Instant:時間戳
Duration:持續(xù)時間,時間差
LocalDate:只包含日期暖哨,比如:2016-10-20
LocalTime:只包含時間赌朋,比如:23:12:10
LocalDateTime:包含日期和時間,比如:2016-10-20 23:14:21
Period:時間段
ZoneOffset:時區(qū)偏移量篇裁,比如:+8:00
ZonedDateTime:帶時區(qū)的時間
Clock:時鐘,比如獲取目前美國紐約的時間

以及java.time.format包中的

DateTimeFormatter:時間格式化

下面我們通過例子來看如何使用java8新的日期時間庫

1赡若、獲取今天的日期

LocalDate todayDate = LocalDate.now();
System.out.println("今天的日期:"+todayDate);
//結(jié)果
今天的日期:2016-10-20

2达布、指定日期,進行相應(yīng)操作

//取2016年10月的第1天
LocalDate firstDay = oneday.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(firstDay);
        
//取2016年10月的第1天逾冬,另外一種寫法
LocalDate firstDay2 = oneday.withDayOfMonth(1);
System.out.println(firstDay2);
        
//取2016年10月的最后1天黍聂,不用考慮大月,小月身腻,平年产还,閏年
LocalDate lastDay = oneday.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDay);
        
//當前日期+1天
LocalDate tomorrow = oneday.plusDays(1);
System.out.println(tomorrow);

//判斷是否為閏年
boolean isLeapYear = tomorrow.isLeapYear();
System.out.println(isLeapYear);

//運行結(jié)果
2016-10-20
2016-10-01
2016-10-01
2016-10-31
2016-10-21
true

3、生日檢查或者賬單日檢查

開發(fā)過程中嘀趟,經(jīng)常需要為過生日的用戶送上一些祝福脐区,例如,用戶的生日為1990-10-12她按,如果今天是2016-10-12牛隅,那么今天就是用戶的生日(按公歷/身份證日期來算),那么通過java8新的日期庫酌泰,我們該如何來進行判斷媒佣?

在java8中,可以使用MonthDay陵刹,該類不包含年份信息默伍,當然還有一個類是YearMonth

LocalDate birthday = LocalDate.of(1990, 10, 12);
MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay today = MonthDay.from(LocalDate.of(2016, 10, 12)); 
        System.out.println(today.equals(birthdayMd));
//結(jié)果
true

4、獲取當前的時間

日期主要是使用LocalTime衰琐,該類不包含日期也糊,只有時間信息

//獲取當前的時間
LocalTime nowTime = LocalTime.now(); //結(jié)果14:29:40.558
        
//如果不想顯示毫秒
LocalTime nowTime2 = LocalTime.now().withNano(0); //14:43:14
        
//指定時間
LocalTime time = LocalTime.of(14, 10, 21); //14:10:21
LocalTime time2 = LocalTime.parse("12:00:01"); // 12:00:01
        
//當前時間增加2小時
LocalTime nowTimePlus2Hour = nowTime.plusHours(2); //16:47:23.144
//或者
LocalTime nowTimePlus2Hour2 = nowTime.plus(2, ChronoUnit.HOURS);

5、日期前后比較

比較2個日期哪個在前碘耳,哪個在后显设,java8 LocalDate提供了2個方法,isAfter(),isBefore

LocalDate today = LocalDate.now();
LocalDate specifyDate = LocalDate.of(2015, 10, 20);
System.out.println(today.isAfter(specifyDate)); //true

6辛辨、處理不同時區(qū)的時間

java8中捕捂,將日期瑟枫,時間,時區(qū)都很好的進行了分離指攒。

//查看當前的時區(qū)
ZoneId defaultZone = ZoneId.systemDefault();
System.out.println(defaultZone); //Asia/Shanghai
        
//查看美國紐約當前的時間
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime shanghaiTime = LocalDateTime.now();
LocalDateTime americaDateTime = LocalDateTime.now(america);
System.out.println(shanghaiTime); //2016-11-06T15:20:27.996
System.out.println(americaDateTime); //2016-11-06T02:20:27.996 慷妙,可以看到美國與北京時間差了13小時
    
//帶有時區(qū)的時間
ZonedDateTime americaZoneDateTime = ZonedDateTime.now(america);
System.out.println(americaZoneDateTime); //2016-11-06T02:23:44.863-05:00[America/New_York]

7、比較兩個日期之前時間差

在項目中允悦,經(jīng)常需要比較兩個日期之間相差幾天膝擂,或者相隔幾個月,我們可以使用java8的Period來進行處理隙弛。

LocalDate today = LocalDate.now();
LocalDate specifyDate = LocalDate.of(2015, 10, 2);
Period period = Period.between(specifyDate, today);

System.out.println(period.getDays());  //4
System.out.println(period.getMonths()); //1
System.out.println(specifyDate.until(today, ChronoUnit.DAYS)); //401
//輸出結(jié)果
4
1
401

我們可以看到架馋,我們使用Period類比較天數(shù),比較奇怪全闷,他返回的值叉寂,并不是2個日期之間總共的天數(shù)差,而是一個相對天數(shù)差总珠,比如屏鳍,5月1日,和10月2日局服,他比較的是僅僅2個天之間的差钓瞭,那1號和2號,相差1天淫奔,而實際上山涡,因為中間相差了好幾個月,所以真正的天數(shù)差肯定不是1天搏讶,所以我們可以使用until佳鳖,并指明精度單位是days,就可以計算真正的天數(shù)差了媒惕。

8系吩、日期時間格式解析、格式化

在java8之前妒蔚,我們進行時間格式化主要是使用SimpleDateFormat穿挨,而在java8中,主要是使用DateTimeFormatter,java8中肴盏,預定義了一些標準的時間格式科盛,我們可以直接將時間轉(zhuǎn)換為標準的時間格式:

String specifyDate = "20151011";
DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;
LocalDate formatted = LocalDate.parse(specifyDate,formatter); 
System.out.println(formatted); 
//輸出
2015-10-11

當然,很多時間標準的時間格式可能也不滿足我們的要求菜皂,我們需要轉(zhuǎn)為自定義的時間格式

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY MM dd");
System.out.println(formatter2.format(LocalDate.now()));
//結(jié)果
2015 10 11

9贞绵、java8 時間類與Date類的相互轉(zhuǎn)化

在轉(zhuǎn)換中,我們需要注意恍飘,因為java8之前Date是包含日期和時間的榨崩,而LocalDate只包含日期谴垫,LocalTime只包含時間,所以與Date在互轉(zhuǎn)中母蛛,勢必會丟失日期或者時間翩剪,或者會使用起始時間。如果轉(zhuǎn)LocalDateTime彩郊,那么就不存在信息誤差前弯。

//Date與Instant的相互轉(zhuǎn)化
Instant instant  = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();
        
//Date轉(zhuǎn)為LocalDateTime
Date date2 = new Date();
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());
        
//LocalDateTime轉(zhuǎn)Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();
Date date3 = Date.from(instant);

//LocalDate轉(zhuǎn)Date
//因為LocalDate不包含時間,所以轉(zhuǎn)Date時秫逝,會默認轉(zhuǎn)為當天的起始時間恕出,00:00:00
LocalDate localDate4 = LocalDate.now();
Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date date4 = Date.from(instant);

總結(jié),其實想說的這筷登,這篇文章是一篇難產(chǎn)很久的文章剃根,自從十一假期后,一直找不到寫代碼的感覺前方,所以這篇文章拖了1個月。

?聲明:除非注明廉油,本站所有文章皆為原創(chuàng)惠险,轉(zhuǎn)載請以鏈接形式標明本文地址。
?轉(zhuǎn)載請注明來源:https://www.rjkf.cn/java8-date-localdate/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抒线,一起剝皮案震驚了整個濱河市班巩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘶炭,老刑警劉巖抱慌,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眨猎,居然都是意外死亡抑进,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門睡陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寺渗,“玉大人,你說我怎么就攤上這事兰迫⌒攀猓” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵汁果,是天一觀的道長涡拘。 經(jīng)常有香客問我,道長据德,這世上最難降的妖魔是什么鳄乏? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任跷车,我火速辦了婚禮,結(jié)果婚禮上汞窗,老公的妹妹穿的比我還像新娘姓赤。我一直安慰自己,他們只是感情好仲吏,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布不铆。 她就那樣靜靜地躺著,像睡著了一般裹唆。 火紅的嫁衣襯著肌膚如雪誓斥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天许帐,我揣著相機與錄音劳坑,去河邊找鬼。 笑死成畦,一個胖子當著我的面吹牛距芬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播循帐,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼框仔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拄养?” 一聲冷哼從身側(cè)響起离斩,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘪匿,沒想到半個月后跛梗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡棋弥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年核偿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘁锯。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡宪祥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出家乘,到底是詐尸還是另有隱情蝗羊,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布仁锯,位于F島的核電站耀找,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜野芒,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一蓄愁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狞悲,春花似錦撮抓、人聲如沸撕捍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斤程。三九已至荸恕,卻和暖如春乖酬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背融求。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工咬像, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人生宛。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓县昂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陷舅。 傳聞我的和親對象是個殘疾皇子七芭,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

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