在jdk8之前經常使用到的時間API包括(Date、Calendar),date與字符串之間的轉換使用SimpleDateFormat進行轉換,用SimpleDateFormat類的parse方法,可以將滿足格式要求的字符串轉換成Date對象,使用SimpleDateFormat類的format方法,可以將Date類型的對象轉換成一定格式的字符串。然而SimpleDateFormat並非是線程安全的。在jdk8中爲了使用時間更加便利,在java.time包下新增時間API。使用DateTimeFormatter的parse將字符串轉換成時間格式,format方法將日期、時間轉換成字符串格式。
1.1、時間API
-
ZoneId:時區ID,用來確定Instant和LocalDateTime互相轉換的規則。
-
Instant:用來表示時間線上的一個點。
-
LocalDate:表示沒有時區的日期,LocalDate是不可變且線程安全的。
-
LocalTime:表示沒有時區的時間,LocalTime是不可變且線程安全的。
-
LocalDateTime:表示沒有時區的日期時間,LocalDateTime是不可變且線程安全的。
-
Clock:用於訪問當前時刻、日期、時間、用到時區。
-
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 |