JDK8時間API整理

在jdk8之前經常使用到的時間API包括(Date、Calendar),date與字符串之間的轉換使用SimpleDateFormat進行轉換,用SimpleDateFormat類的parse方法,可以將滿足格式要求的字符串轉換成Date對象,使用SimpleDateFormat類的format方法,可以將Date類型的對象轉換成一定格式的字符串。然而SimpleDateFormat並非是線程安全的。在jdk8中爲了使用時間更加便利,在java.time包下新增時間API。使用DateTimeFormatter的parse將字符串轉換成時間格式,format方法將日期、時間轉換成字符串格式。

1.1、時間API

  1. ZoneId:時區ID,用來確定Instant和LocalDateTime互相轉換的規則。

  2. Instant:用來表示時間線上的一個點。

  3. LocalDate:表示沒有時區的日期,LocalDate是不可變且線程安全的。

  4. LocalTime:表示沒有時區的時間,LocalTime是不可變且線程安全的。

  5. LocalDateTime:表示沒有時區的日期時間,LocalDateTime是不可變且線程安全的。

  6. Clock:用於訪問當前時刻、日期、時間、用到時區。

  7. Duration:用秒和納秒錶示時間。

最常用的就是LocalDate、LocalTime、LocalDateTime了、從他們的名字可以看出是操作日期、時間的。

LocalDate日期

說明 方法 返回結果示例
獲取當前日期 LocalDate.now() 2019-05-14
日期構造 LocalDate.of(2019,05,14) 2019-05-14
字符串轉LocalDate LocalDate.parse("2019-06-01") 2019-06-01
獲取明天的日期 LocalDate.now().plusDays(1) / LocalDate.now().plus(1, ChronoUnit.DAYS) 2019-05-15
在今天的基礎上減去一個月 LocalDate.now().minusMonths(1)/LocalDate.now().minus(1, ChronoUnit.MONTHS) 2019-04-14
解析日期,獲取星期 LocalDate.parse("2019-05-14").getDayOfWeek() TUESDAY
解析日期,獲取本月的第幾天 LocalDate.parse("2019-05-14").getDayOfMonth() 14
判斷今年是否爲閏年 LocalDate.now().isLeapYear() false
獲取本月的第一天 LocalDate.parse("2019-05-14").with(TemporalAdjusters.firstDayOfMonth()) 2019-05-01

LocalTime時間

說明 方法 示例
獲取當前時間 LocalTime.now() 20:46:15.170
時間構造 LocalTime.of(17,30,14) 17:30:14
字符串時間解析爲LocalTime LocalTime.parse("17:30") 17:30
獲取小時 LocalTime.now().getHour() 20
獲取分鐘 LocalTime.now().getMinute() 46
判斷一個時間是否在另一時間之前 LocalTime.parse("17:30").isBefore(LocalTime.parse("17:29")) false
判斷一個時間是否在另一時間之後 LocalTime.parse("17:30").isAfter(LocalTime.parse("17:29")) true
每天的開始 LocalTime.MIN 00:00
每天的結束 LocalTime.MAX 23:59:59.999999999

LocalDateTime(日期時間,可通過getXX獲取年月日時分秒)

說明 方法 示例
獲取當前日期的時間 LocalDateTime.now() 2019-05-14T20:57:18.094
日期時間構造 LocalDateTime.of(2019,05,14,17,30,14) 2019-05-14T17:30:14
日期時間加1天 LocalDateTime.now().plusDays(1) 2019-05-15T20:57:18.094
日期時間減1天 LocalDateTime.now().minusDays(1) 2019-05-13T20:57:18.094

Instant(時間戳)

說明 方法 示例
當前UTC時區 Instant.now() 2019-05-14T13:10:33.982Z
東八區 Instant.now().atOffset(ZoneOffset.ofHours(8)) 2019-05-14T21:10:34.022+08:00
獲取毫秒值 Instant.now().toEpochMilli() 1557839434023
通過毫秒獲取時間(UTC時區) Instant.ofEpochMilli(1) 1970-01-01T00:00:00.001Z
通過時區ID獲取時間 LocalDateTime.now(ZoneId.of("Europe/London")) 2019-05-14T14:10:34.030
比較兩個日期的差別 ChronoUnit.DAYS.between(temporal1,temporal2) 相差的天數

DateTimeFormatter(時間與字符串之間的轉換)

說明 方法 示例
轉換格式 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")  
字符串轉LocalDateTime LocalDateTime.parse("2019-05-14 21:15:30.555",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")) 2019-05-14T21:15:30.555
LocalDateTime轉字符串 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(LocalDateTime.now()) 2019-05-14 21:18:22.902

各時間與Date之間互轉

說明 方法 示例
Date轉換爲LocalDateTime Date.from(Instant.now()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime() 2019-05-14T21:43:57.650
LocalDateTime轉Date Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()) Tue May 14 21:43:57 CST 2019
LocalDate轉Date Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()) Tue May 14 00:00:00 CST 2019
Date轉字符串 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(Date.from(new Date().toInstant()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()) 2019-05-14 21:43:57.706
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章