Java 8 Date-Time API概覽

根據(jù)網(wǎng)上資料整理

java 8增加了新的Date-Time API (JSR 310),增強對日期與時間的處理牺勾。它在很大程度上受到Joda-Time的影響。之前寫過一篇關(guān)于Joda-Time的文章,還沒寫完纫普,現(xiàn)在直接寫這個java 8的新Date-Time API。

Date-Time API都在java.time包下好渠。

一昨稼、設(shè)計理念

Date-Time API使用如下幾個設(shè)計理念開發(fā)而成。

清晰

API里的方法定義良好拳锚,它們的行為是明確可預(yù)測的假栓。例如,調(diào)用一個Date-Time方法并傳遞一個null參數(shù)必定會觸發(fā)NullPointerException異常霍掺。

流式

Date-Time API 提供一個流式接口匾荆,使代碼更容易被閱讀拌蜘。因為大多數(shù)方法不允許null參數(shù),也不會返回null牙丽,方法調(diào)用可以被連在一起简卧,使代碼更快被理解。例如:

LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);

不可變

Date-Time API中的大多數(shù)類創(chuàng)建的對象都是不可變的烤芦,當(dāng)它被創(chuàng)建后不能被修改举娩。對不可變對象進行的一些操作會返回一個新對象。這意味這Date-Time API是線程安全的构罗。例如铜涉,創(chuàng)建一個date或者time對象使用of, from, 或者 with前綴,而不是一個構(gòu)造器遂唧,并且也沒有set方法骄噪。

LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);

可擴展

Date-Time API可以是可擴展的。你可以定義你自己的時間調(diào)節(jié)器和查詢蠢箩,或者構(gòu)建你自己的calendar 系統(tǒng)链蕊。

二、概覽

java.time包里有許多可以代表時間和日期的類谬泌。這是一個非常豐富的API滔韵。下面列出幾個關(guān)鍵的類:

  • Instant類,提供了一個機器視角的時間線掌实。
  • LocalDate, LocalTimeLocalDateTime類提供了人類視角的日期和時間陪蜻,不涉及到時區(qū)。
  • ZoneId, ZoneRulesZoneOffset類描述了時區(qū)贱鼻,時區(qū)偏移量和時區(qū)規(guī)則宴卖。
  • ZonedDateTime類,代表了與時區(qū)關(guān)聯(lián)的時間和日期邻悬。OffsetDateTimeOffsetTime分別代表了日期和時間和時間症昏。這些類描述了時區(qū)偏移。
  • Duration類在秒和毫秒尺度丈量一段時間父丰。
  • Period類在年肝谭、月和日尺度上丈量一段時間。

其他不是ISO日歷系統(tǒng)的可以使用java.time.chrono包中的類蛾扇。這里不介紹啦攘烛。

三、實例

3.1 獲取當(dāng)前日期和時間

LocalDate可以表示當(dāng)前日期镀首。它只包含日期不包含時分秒坟漱。

LocalTime可以表示當(dāng)前時間。它不包含日期更哄。

LocalDate date = LocalDate.now();
System.out.println(date);

LocalTime time = LocalTime.now();

System.out.println(time);

// 輸出
2017-03-07
23:16:45.433

由此可見它輸出的日期是格式化后的芋齿。

3.2 獲取當(dāng)前年月日

LocalDate now = LocalDate.now();  
int year = now.getYear();  
int month = now.getMonthValue();  
int day = now.getDayOfMonth();

System.out.println(year);
System.out.println(month);
System.out.println(day);

// 輸出
2017
3
7

不用考慮用java.util.Calendar月份從0開始的問題须眷。

3.3 獲取指定日期**

LocalDate date = LocalDate.of(2017, 2, 14);

System.out.println(date);

// 輸出
2017-02-14

根據(jù)月日判斷日期是否相等

MonthDay不包含年份信息」低唬可以用來代表每年重復(fù)出現(xiàn)的日期。

LocalDate now = LocalDate.now();

System.out.println(MonthDay.from(now));

System.out.println(MonthDay.of(6,1));

System.out.println(MonthDay.from(now).equals(MonthDay.of(6,1)));

// 輸出
--03-07
--06-01
false

可以看到年份被-代替了捕传。

3.4 日期格式化與解析

// 將字符串解析為日期對象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse("2017-06-01",formatter);
System.out.println(date);

// 將日期重新格式化輸出
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd");
System.out.println(date.format(formatter2));


// 輸出
2017-06-01
2017:06:01

3.5 增加(減少)固定的時間

LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);

// 增加1小時
dateTime = dateTime.plusHours(1);
System.out.println(dateTime);

// 增加1天
dateTime = dateTime.plusDays(1);
System.out.println(dateTime);

// 輸出
2017-03-08T13:56:00.728
2017-03-08T14:56:00.728
2017-03-09T14:56:00.728

都是.plusXXX惠拭,如果想減少,傳入負數(shù)即可庸论。

3.6 增加(減少)固定的時間第二種方式

LocalDate date = LocalDate.now();
System.out.println(date);

LocalDate nextWeek = date.plus(1, ChronoUnit.WEEKS);

System.out.println(nextWeek);

// 輸出
2017-03-08
2017-03-15

ChronoUnit類有許多常用單位职辅,意思也很容易明白。

3.7 比較日期前后順序

LocalDate today = LocalDate.now();

LocalDate childrensDay = LocalDate.of(2017,6,1);

System.out.println(today.isAfter(childrensDay));
System.out.println(childrensDay.isAfter(today));

// 輸出
false
true

3.8 判斷是否是閏年

LocalDate today = LocalDate.now();

System.out.println(today.isLeapYear());

// 輸出
false

3.9 計算兩日期間的天數(shù)等

LocalDateTime today = LocalDateTime.now();
LocalDateTime childrensDay = LocalDateTime.of(2017,6,1,0,0,0);
Duration duration = Duration.between(today,childrensDay);

System.out.println(duration.toDays());
System.out.println(duration.toHours());

LocalDate today2 = LocalDate.now();
LocalDate childrensDay2 = LocalDate.of(2017,6,1);
Period period = Period.between(today2,childrensDay2);

System.out.println(period.getMonths());
System.out.println(period.getYears());

// 輸出
84
2017
2
0

3.10 新舊Date轉(zhuǎn)換

Date d = new Date();
Instant i = d.toInstant();

// 轉(zhuǎn)換成北京時間
LocalDate date = i.atOffset(ZoneOffset.ofHours(8)).toLocalDate();

Instant timestamp = Instant.now();
Date d = Date.from(timestamp);

3.11 獲取當(dāng)前毫秒

Clock clock = Clock.systemUTC();

System.out.println(clock.millis());

// 輸出
1488984534369

3.12 獲取兩個日期間相差天數(shù)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse("2017-12-01",formatter);
LocalDate today = LocalDate.now();

System.out.println(ChronoUnit.DAYS.between(date,today));

// 輸出
5

以后有什么好的例子再補充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聂示,一起剝皮案震驚了整個濱河市域携,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鱼喉,老刑警劉巖秀鞭,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扛禽,居然都是意外死亡锋边,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門编曼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豆巨,“玉大人,你說我怎么就攤上這事掐场⊥樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵熊户,是天一觀的道長萍膛。 經(jīng)常有香客問我,道長嚷堡,這世上最難降的妖魔是什么卦羡? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮麦到,結(jié)果婚禮上绿饵,老公的妹妹穿的比我還像新娘。我一直安慰自己瓶颠,他們只是感情好拟赊,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粹淋,像睡著了一般吸祟。 火紅的嫁衣襯著肌膚如雪瑟慈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天屋匕,我揣著相機與錄音葛碧,去河邊找鬼。 笑死过吻,一個胖子當(dāng)著我的面吹牛进泼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纤虽,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乳绕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逼纸?” 一聲冷哼從身側(cè)響起洋措,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杰刽,沒想到半個月后菠发,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贺嫂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年雷酪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝婉。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哥力,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墩弯,到底是詐尸還是另有隱情吩跋,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布渔工,位于F島的核電站锌钮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏引矩。R本人自食惡果不足惜梁丘,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旺韭。 院中可真熱鬧氛谜,春花似錦、人聲如沸区端。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽织盼。三九已至杨何,卻和暖如春酱塔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背危虱。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工羊娃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埃跷。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓蕊玷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捌蚊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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