根據(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
,LocalTime
和LocalDateTime
類提供了人類視角的日期和時間陪蜻,不涉及到時區(qū)。 -
ZoneId
,ZoneRules
和ZoneOffset
類描述了時區(qū)贱鼻,時區(qū)偏移量和時區(qū)規(guī)則宴卖。 -
ZonedDateTime
類,代表了與時區(qū)關(guān)聯(lián)的時間和日期邻悬。OffsetDateTime
和OffsetTime
分別代表了日期和時間和時間症昏。這些類描述了時區(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
以后有什么好的例子再補充