Java 8 時間和日期 API

今天我們說說 Java 8 新的時間 API,由于之前的api并不理想也存在問題。所以出現(xiàn)了一套全新的日期API,在java.time路徑下。

LocalDate

LocalDate類型包含了年月日信息,下面舉些LocalDate的使用示例:

LocalDate date = LocalDate.of(2019,4,20);// 2019-07-04

int year = date.getYear();// 2019

int month = date.getMonth().getValue();// 7

int day = date.getDayOfMonth();// 4

// 查看該月有多少天

intdays = date.lengthOfMonth();// 31

// 是否是閏年

booleanisLeap = date.isLeapYear();

// 查看當天 年月日

LocalDate today = LocalDate.now();// 2019-07-04

除了調(diào)用LocalDate的getYear方法外,我們也可以使用ChronoField枚舉類型來實現(xiàn)相同的功能:

int year1 = date.get(ChronoField.YEAR);// 2019

int month1 = date.get(ChronoField.MONTH_OF_YEAR);// 7

int day1 = date.get(ChronoField.DAY_OF_MONTH);// 4

// 當前日期屬于該月第幾周

int weekOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH);// 1

ChronoField枚舉類型包含了諸多的屬性可供選擇:


修改 LocalDate 對象

LocalDate date3 = LocalDate.of(2018,4,20);// 2018-04-20

LocalDate date4 = date3.withDayOfMonth(22);// 2018-04-22

LocalDate date5 = date3.with(ChronoField.DAY_OF_MONTH,22);// 2018-04-22

LocalDate date6 = date3.withYear(2019);// 2019-04-20

LocalDate date7 = date3.plusDays(5);// 2018-04-25

LocalDate date8 = date3.plus(5, ChronoUnit.DAYS);// 2018-04-25

LocalDate date9 = date3.minusYears(10);// 2008-04-20

TemporalAdjusters類提供了許多靜態(tài)方法來修改LocalDate對象。當我們需要獲取下一個周天,下一個工作日,本月的最后一天等信息時,TemporalAdjusters類便可派上用場:

importstaticjava.time.temporal.TemporalAdjusters.*;

LocalDate date10 = date3.with(nextOrSame(DayOfWeek.MONDAY));// 2018-04-23

LocalDate date11 = date3.with(lastDayOfMonth());// 2018-04-30

LocalDate date12 = date3.with(previous(DayOfWeek.SATURDAY));// 2018-04-14

格式化

String str1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);// 20190704

String str2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);// 2019-07-04

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");

String str5 = date.format(dtf);// 2019-07-04

LocalDate date13 = LocalDate.parse(str5, dtf);// 2019-07-04

LocalDate和下面要介紹的LocalTime,LocalDateTime之間共享了許多類似的方法,上面介紹的LocalDate修改、格式化等方法通用適用于LocalTime和LocalDateTime。

LocalTime

LocalTime和LocalDate類似,區(qū)別在于LocalTime包含的是時分秒(毫秒)信息。舉些LocalTime的例子:

LocalTime time = LocalTime.of(20,13,54);// 20:13:54

int hour = time.getHour();// 20

int minute = time.getMinute();// 13

int second = time.getSecond();// 54

LocalDate和LocalTime都可以通過字符串來創(chuàng)建:

LocalDate date = LocalDate.parse("2019-04-20");

LocalTime time = LocalTime.parse("20:13:54");

LocalDateTime

LocalDateTime是LocalDate和LocalTime的組合形式,包含了年月日時分秒信息。舉些LocalDateTime的使用示例:

LocalDateTime ldt1 = LocalDateTime.of(2018,4,20,20,13,54);// 2018-04-20T20:13:54

LocalDateTime ldt2 = LocalDateTime.of(date, time);// 2019-04-20T20:13:54

LocalDateTime可以轉(zhuǎn)換為LocalDate和LocalTime,轉(zhuǎn)換后包含的信息減少了:

LocalDate date1 = ldt1.toLocalDate();// 2019-04-20

LocalTime time1 = ldt1.toLocalTime();// 20:13:54

Duration

Duration用于計算兩個LocalTime或者LocalDateTime的時間差,例如:

LocalTime time2 = LocalTime.of(23,59,59);

Duration duration = Duration.between(time1, time2);

longseconds = duration.getSeconds();// 13565

time1和time2之間相差了13565秒。

手動創(chuàng)建Duration對象:

Duration threeMinutes = Duration.ofMinutes(3);

threeMinutes = Duration.of(3, ChronoUnit.MINUTES);// 創(chuàng)建了一個3分鐘的Duration,兩種創(chuàng)建方式等價

Period

Period用于計算兩個LocalDate之間的時長。舉些例子:

LocalDate date2 = LocalDate.of(2018,5,21);

Period period = Period.between(date1, date2);

int monthsBetween = period.getMonths();// 1

int daysBetween = period.getDays();// 1

2018-04-21和2018-04-20之間月份相差1,天數(shù)相差1。

同樣的,我們也可以手動創(chuàng)建Period對象:

Period tenDays = Period.ofDays(10);

Period threeWeeks = Period.ofWeeks(3);

Period twoYearsSixMonthsOneDay = Period.of(2,6,1);

比較兩個時間的先后

LocalDate date15 = LocalDate.of(2018,4,21);

date.isEqual(date15);// false

date.isAfter(date15);// false

date.isBefore(date15);// true

MonthDay 使用

MonthDay只包含月日信息,可以用于存放類似于生日,結(jié)婚紀念日等信息。舉個使用MonthDay的例子:

LocalDate birthday = LocalDate.of(1999,9,9);

MonthDay monthDay = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());

MonthDay currentMonthDay = MonthDay.from(LocalDate.now());

if(currentMonthDay.equals(monthDay)) {? ?

System.out.println("happy birthday!");

}

假如用戶的生日是1999年9月9號,那么可以通過這種方法來判斷今天是否是用戶的生日,如果是的話便發(fā)送生日祝福。同樣的也有YearMonth類,只包含 年月信息。就不啰嗦了。

最后

本號專注Java源碼分析。喜歡底層源碼的朋友可以來交流探討。交流群:818491202 驗證:88

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容