LocalDateTime 、LocalDate、LocalTime是 Java8 提供的位于 java.time 包下的新的日期與時(shí)間處理類。一個(gè)重要的特性是它們都是線程安全的。
源碼注釋:
This class is immutable and thread-safe.(不可變、線程安全)
獲取當(dāng)前日期-時(shí)間:now
LocalDateTime包含年月日時(shí)分秒:
LocalDateTime localDateTime = LocalDateTime.now();

LocalDate只包含年月日:
LocalDate localDate = LocalDate.now();

LocalTime只包含時(shí)分秒:
LocalTime localTime = LocalTime.now();

獲取指定日期-時(shí)間:of
//獲取2020年4月1日12時(shí)0分0秒的日期時(shí)間
LocalDateTime localDateTime = LocalDateTime.of(2020, 4, 1, 12, 0, 0);
//或者先指定LocalDate、LocalTime
LocalDate localDate = LocalDate.of(2020, 4, 1);
LocalTime localTime = LocalTime.of(12, 0, 0);
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
解析字符串日期-時(shí)間:parse
使用 DateTimeFormatter.ofPattern(String pattern) 指定解析格式。
LocalDateTime localDateTime = LocalDateTime.parse("2020-04-02 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDate localDate = LocalDate.parse("2020/04/01", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
LocalTime localTime = LocalTime.parse("121212", DateTimeFormatter.ofPattern("HHmmss"));
注意:使用 LocalDateTime.parse() 解析時(shí)要解析的字符串日期要包含時(shí)分秒,否則將報(bào)解析異常。
格式化日期-時(shí)間:format
使用 DateTimeFormatter.ofPattern(String pattern) 指定格式化格式。
LocalDateTime localDateTime = LocalDateTime.of(2020, 4, 1, 12, 0, 0);
String dateTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
> 結(jié)果:2020/04/01 12:00:00
LocalDate localDate = LocalDate.now();
String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
> 結(jié)果:2020-04-01
LocalTime localTime = LocalTime.now();
String time = localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
> 結(jié)果:12:12:12
日期-時(shí)間增減:plus、minus
LocalDateTime localDateTime = LocalDateTime.now();
localDateTime = localDateTime.minusYears(2); //加兩年
localDateTime = localDateTime.minusMonths(2); //減兩月
......
//指定加減的單位
localDateTime = localDateTime.minus(1, ChronoUnit.DAYS); //減一天
localDateTime = localDateTime.plus(1, ChronoUnit.HOURS); //加一小時(shí)
日期時(shí)間間隔:Duration
Duration用于獲取兩時(shí)間的間隔秒+納秒,傳入的時(shí)間對象必須含有秒SECONDS單元,所以可以計(jì)算LocalDateTime、LocalTime,不能用于計(jì)算LocalDate。如果兩對象是不同類型的,則根據(jù)第一個(gè)對象的類型來計(jì)算時(shí)間間隔。例如,如果第一個(gè)參數(shù)是LocalTime,則第二個(gè)參數(shù)將轉(zhuǎn)換為LocalTime。
//計(jì)算兩個(gè)LocalDateTime的秒間隔
LocalDateTime start = LocalDateTime.of(2020, 2, 29, 12, 0, 0);
LocalDateTime end = LocalDateTime.of(2020, 4, 3, 12, 0, 0);
Duration duration = Duration.between(start, end);
//計(jì)算兩個(gè)LocalTime的秒間隔
Duration duration1 = Duration.between(LocalTime.of(12, 0, 0), LocalTime.of(14, 0, 0));
獲取的結(jié)果:

根據(jù)
Duration轉(zhuǎn)換天toDays、小時(shí)toHours、分鐘toMinutes
long days = duration.toDays();
long hours = duration.toHours();
long minutes = duration.toMinutes();
Duration也可使用plus、minus進(jìn)行增減操作
duration = duration.plusDays(1); //加一天
duration = duration.minus(1, ChronoUnit.HOURS); //減一小時(shí)
日期間隔:Period
Period用于獲取一個(gè)期間,該期間由兩個(gè)日期之間的年,月和日組成。包括開始日期,但不包括結(jié)束日期
LocalDate start = LocalDate.of(2018, 2, 12);
LocalDate end = LocalDate.of(2020, 4, 1);
Period period = Period.between(start, end);
//提取間隔年、月、天
int days = period.getDays();
int months = period.getMonths();
int years = period.getYears();

注意:從上面可以看出,使用
Period獲取的的間隔會做合并處理。比如3月1日至3月31日則記為一個(gè)月。實(shí)列:從2010-01-15到2011-03-18是一年零兩個(gè)月零三天。
之前說了使用Duration可以計(jì)算LocalDateTime、LocalTime,不能用于計(jì)算LocalDate間隔。使用Period獲取的的間隔又會做合并處理。那么怎么才能求兩個(gè)LocalDate的實(shí)際間隔天數(shù)呢?答案是使用toEpochDay:
LocalDate start = LocalDate.of(2020, 2, 12);
LocalDate end = LocalDate.of(2020, 4, 1);
long days = end.toEpochDay() - start.toEpochDay();
Instant
獲取當(dāng)前時(shí)間:now
//默認(rèn)UTC時(shí)區(qū)
Instant instant = Instant.now();
System.err.println(instant);
//使用時(shí)區(qū)偏移獲取當(dāng)前時(shí)區(qū)
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.err.println(offsetDateTime);
輸出結(jié)果:
2020-07-12T12:46:52.733Z
2020-07-12T20:46:52.733+08:00
時(shí)間戳:
7instant.toEpochMilli();
TemporalAdjuster:時(shí)間校正器
TemporalAdjusters:該類通過靜態(tài)方法提供了大量的常用TemporalAdjuster的實(shí)現(xiàn)
舉例:
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime lo = dateTime.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY));
System.err.println(lo);
輸出結(jié)果:2020-07-03T22:12:05.123