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