Java8新特性之Date/Time API應用詳解

一、摘要

  1. Java8 Date/Time API相關的類:LocalDateLocalTimeLocalDateTime,這三個類有一個公共特點就是同String類一樣,都是密封類(final修飾),不允許繼承(都位於java.time包下)
  2. Java8之前常用SimpleDateFormat dateformat = new SimpleDateFormat(new Date());的方式來格式化時間,程序中出現大量的SimpleDateFormat類,既不簡潔實用,造成代碼臃腫,且可讀性非常低
  3. Java8以前使用new Date()獲取月時,從0開始,每次都要+1,獲取本月最後一天,要分情況判斷28293031,非常麻煩,代碼量非常繁瑣。Java8中的 Date/Time API 使得這些問題都解決了

二、獲取當前日期

LocalDate

LocalDate.now();// 獲取當前日期 format: yyyy-MM-dd 輸出:2019-02-20

LocalTime

LocalTime.now();  // 獲取當前時間 format: HH:mm:ss 輸出:10:13:11.241

LocalDateTime

LocalDateTime.now();  // 獲取當前日期時間 format: yyyy-MM-dd HH:mm:ss 輸出:2019-02-20T10:13:11.241

三、LocalDate API

類方法

獲取當前日期

LocalDate nowDate = LocalDate.now();// 輸出 2019-02-20

自定義時間

LocalDate formatDate = LocalDate.parse("2019-01-01");// 輸出 2019-01-01

實例方法

獲取當天所屬本月中的第幾天

int dayOfMonth = nowDate.getDayOfMonth();// 輸出 20

獲取當天所屬本年中的第幾天

int dayOfYear = nowDate.getDayOfYear();// 輸出 51

獲取當天所屬本週的周幾

DayOfWeek dayOfWeek = nowDate.getDayOfWeek();// 輸出 WEDNESDAY
int value = nowDate.getDayOfWeek().getValue();// 輸出 3

獲取當月所屬本年的第幾月,與new Date()相比它是從1開始,拋棄了之前的從0開始

Month month = nowDate.getMonth();// 輸出 FEBRUARY
int value = nowDate.getMonth().getValue();// 輸出 2
int monthValue = nowDate.getMonthValue();// 輸出 2

獲取當前年份

int year = nowDate.getYear();// 輸出 2019

獲得此日期適用的時代

Era era = nowDate.getEra();// 輸出 CE

獲取本月第一天

LocalDate firstDayOfMonth= nowDate.with(TemporalAdjusters.firstDayOfMonth());// 輸出 2019-02-01

獲取本月第二天
LocalDate withDayOfMonth(int dayOfMonth) : 返回此LocalDate的副本,其中包含日期更改

LocalDate dayOfMonth = nowDate.withDayOfMonth(2);// 輸出 2019-02-02

獲取本月最後一天(無須再判斷當月是28、29、30、31天)
LocalDate with(TemporalAdjuster adjuster) : 返回此日期的調整副本

LocalDate lastDayOfMonth = nowDate.with(TemporalAdjusters.lastDayOfMonth());// 輸出 2019-02-28

獲取下一天日期
LocalDate plusDays(long daysToAdd) : 返回此LocalDate的副本,並添加指定的天數

LocalDate plusDays = nowDate.plusDays(1);// 輸出 2019-02-21

獲取下一週的今天
LocalDate plusWeeks(long weeksToAdd) : 返回此LocalDate的副本,並添加指定的週數

LocalDate plusWeeks = nowDate.plusWeeks(1);// 輸出 2019-02-27

獲取下一月的今天
LocalDate plusMonths(long monthsToAdd) : 返回此LocalDate的副本,並添加指定的月數

LocalDate plusMonths = nowDate.plusMonths(1);// 輸出 2019-03-20

獲取下一年的今天
LocalDate plusYears(long yearsToAdd) : 返回此LocalDate的副本,其中添加了指定的年數

LocalDate plusYears = nowDate.plusYears(1);// 輸出 2020-02-20

注:TemporalAdjusters類中有許多常用的特殊的日期的方法(類方法),詳情可參照官網

四、LocalTime API

類方法

獲取當前時間

LocalTime nowTime = LocalTime.now();// 輸出 11:07:36.234

實例方法

構建自定義時間

// 方式一
LocalTime localTime = LocalTime.of(0, 0, 0);// 輸出 00:00
// 方式二
LocalTime localTime2 = LocalTime.parse("13:00:00");// 13:00

獲取小時數

int hour = nowTime.getHour();// 輸出 11

獲取分鐘數

int minute = nowTime.getMinute();// 輸出 9

獲取秒數

int second = nowTime.getSecond();// 輸出 36

獲取納秒數

int nano = nowTime.getNano();// 輸出 443000000

五、LocalDateTime API

類方法

獲取當前時間

LocalDateTime nowDateTime = LocalDateTime.now();// 輸出 2019-02-20T11:16:49.426

使用自定義格式器DateTimeFormatter替換了Java8之前的SimpleDateFormat

String nowDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));// 輸出 2019-02-20 11:17:35

六、java.time包中提供的簡單實用的方法(部分)

Clock

java.time.Clock類使用時區提供對當前即時,日期和時間的訪問

Clock類使用時區來返回當前的納秒時間和日期
Clock可以替代System.currentTimeMillis()TimeZone.getDefault()

final Clock clock = Clock.systemUTC();
Instant instant = clock.instant();// 輸出 2019-02-20T03:32:47.810Z
long millis = clock.millis();// 輸出 1550633567860

LocalDate

java.time.LocalDate類表示ISO-8601日曆系統中沒有時區的日期,例如:2007-12-03

LocalDate僅僅包含ISO-8601日曆系統中的日期部分;
LocalTime則僅僅包含該日曆系統中的時間部分。
這兩個類的對象都可以使用Clock對象構建得到

final LocalDate date = LocalDate.now();// 輸出 2019-02-20
final LocalDate dateForClock = LocalDate.now(clock);// 輸出 2019-02-20

LocalTime

java.time.LocalTime類表示ISO-8601日曆系統中沒有時區的時間,例如10:15:30

final LocalTime time = LocalTime.now();// 輸出 11:36:47.735
final LocalTime timeForClock = LocalTime.now(clock);// 輸出 11:36:47.735

LocalDateTime

java.time.LocalDateTime類表示ISO-8601日曆系統中沒有時區的日期時間,例如2007-12-03T10:15:30

final LocalDateTime datetime = LocalDateTime.now();// 輸出 2019-02-20T11:38:36.831
final LocalDateTime datetimeForClock= LocalDateTime.now(clock);// 輸出 2019-02-20T11:38:36.831

ZoneDateTime

java.time.ZonedDateTime類表示ISO-8601日曆系統中具有時區的日期時間,例如:2007-12-03T10:15:30+01:00 Europe/Paris

final ZonedDateTime zonedDatetime = ZonedDateTime.now();// 輸出 2019-02-20T11:40:20.808+08:00[Asia/Shanghai]
final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now(clock);// 輸出 2019-02-20T03:40:20.809Z
final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));// 輸出 2019-02-19T19:40:20.816-08:00[America/Los_Angeles]

Duration

java.time.Duration類以秒和納秒爲單位模擬一個數量或時間量。可以使用其他基於持續時間的單位訪問它,例如分鐘和小時

final LocalDateTime startInclusive = LocalDateTime.of(2018, Month.FEBRUARY, 20, 0, 0, 0);
final LocalDateTime endExclusive = LocalDateTime.of(2019, Month.FEBRUARY, 20, 23, 59, 59);
final Duration duration = Duration.between(startInclusive, endExclusive);
long days = duration.toDays();// 輸出 365
long hours = duration.toHours();// 輸出 8783
long millis = duration.toMillis();// 輸出 31622399000
long nanos = duration.toNanos();// 輸出 31622399000000000

七、JDBC與Java8中的Date/Time關聯

JDBC整合了Java8中的Date/Time API,將Java8中的Date/Time類型與數據庫類型進行了映射,關係如下:

數據庫類型 Java類型
date LocalDate
time LocalTime
timestamp LocalDateTime
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章