Java 8 引入了一個新的日期時間 API,稱為 java.time
套件,它提供了一組新的類別,用於更簡單、更強大、更安全地處理日期和時間。java.time
套件旨在取代舊的 java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
等類別,它的主要優點包括:
- 類別庫的名稱更直觀,類別和方法的名稱更容易理解。
- 類別的設計更加合理,比如日期和時間分開處理,分離了時區和本地化等問題。
- 提供了更好的執行效率和更好的併發性。
- 支持多種曆法和時區,包括 Hijrah、Thai Buddhist、Minguo、ISO、美國等曆法,以及 UTC、GMT、EST、PST、CET、IST 等時區。
以下是一些常用的類別和方法:
1. LocalDate
:表示日期,不包含時間和時區。可以使用靜態工廠方法 LocalDate.of()
創建對象,例如:
val date = LocalDate.of(2023, Month.MARCH, 7)
2. LocalTime
:表示時間,不包含日期和時區。可以使用靜態工廠方法 LocalTime.of()
創建對象,例如:
val time = LocalTime.of(13, 30, 0)
3. LocalDateTime
:表示日期和時間,不包含時區。可以使用靜態工廠方法 LocalDateTime.of()
創建對象,例如:
val dateTime = LocalDateTime.of(2023, Month.MARCH, 7, 13, 30, 0)
4. ZonedDateTime
:表示日期、時間和時區。可以使用靜態工廠方法 ZonedDateTime.of()
創建對象,例如:
val zoneId = ZoneId.of("Asia/Taipei")
val zonedDateTime = ZonedDateTime.of(2023, 3, 7, 13, 30, 0, 0, zoneId)
5. Instant
:表示從 UTC 原點(1970 年 1 月 1 日 00:00:00 UTC)開始的瞬間,可以用來進行日期和時間的計算。可以使用靜態工廠方法 Instant.now()
獲取當前的時間戳,例如:
val now = Instant.now()
6. Duration
:表示時間間隔,可以用來計算兩個日期或時間之間的差值。可以使用靜態工廠方法 Duration.between()
獲取兩個時間之間的差值,例如:
val duration = Duration.between(LocalTime.of(10, 0, 0), LocalTime.now())
println("Duration: ${duration.toMinutes()} minutes")
7. Period
:表示日期間隔,可以用來計算兩個日期之間的差值。可以使用靜態工廠方法 Period.between()
獲取兩個日期之間的差值,例如:
val period = Period.between(LocalDate.of(2023, Month.MARCH, 1), LocalDate.now())
println("Period: ${period.toTotalMonths()} months")
8. DateTimeFormatter
:用於格式化和解析日期和時間。可以使用靜態工廠方法 DateTimeFormatter.ofPattern()
創建格式化對象,例如:
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
val dateTimeStr = formatter.format(LocalDateTime.now())
val dateTime = LocalDateTime.parse(dateTimeStr, formatter)
9. ZoneId
:表示時區,可以使用靜態工廠方法 ZoneId.of()
創建時區對象,例如:
val zoneId = ZoneId.of("Asia/Taipei")
val zonedDateTime = ZonedDateTime.now(zoneId)
以上僅是 java.time
套件中的部分類別和方法,還有很多其他有用的類別和方法,例如 YearMonth
、MonthDay
、TemporalAdjuster
、TemporalQuery
等。使用 java.time
套件可以更加方便、安全和高效地處理日期和時間相關的問題。
10. TemporalAdjuster
:用於對日期和時間進行調整。可以使用 Temporal
類的 with()
方法和 TemporalAdjusters
類的靜態方法進行日期和時間的調整,例如:
val date = LocalDate.of(2023, Month.MARCH, 7)
val nextMonday = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY))
println("Next Monday: $nextMonday")
11. TemporalQuery
:用於從日期和時間中獲取特定的信息。可以使用 TemporalAccessor
類的 query()
方法和 TemporalQueries
類的靜態方法進行信息的獲取,例如:
val dateTime = LocalDateTime.now()
val month = dateTime.query(TemporalQueries.localDate()).month
val dayOfWeek = dateTime.query(TemporalQueries.localDate()).dayOfWeek
println("Month: $month, Day of week: $dayOfWeek")
12. Clock
:用於獲取當前的日期和時間。可以使用靜態方法 Clock.systemDefaultZone()
獲取系統默認時區的 Clock
對象,例如:
val clock = Clock.systemDefaultZone()
val instant = clock.instant()
val dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
println("Current date and time: $dateTime")
13. DurationFormatter
:用於格式化和解析時間間隔。可以使用靜態方法 DurationFormatter.of()
創建格式化對象,例如:
val formatter = DurationFormatter.of("H:mm:ss.S")
val durationStr = formatter.format(Duration.ofSeconds(3661, 123456789))
val duration = formatter.parse(durationStr)
println("Duration: $durationStr, $duration")
這些類別和方法僅是 java.time
套件中的一部分,還有很多其他有用的類別和方法,例如 YearMonth
、MonthDay
、ZoneOffset
、DateTimeParseException
等。使用 java.time
套件可以更加方便、安全和高效地處理日期和時間相關的問題。
14. OffsetDateTime
:用於表示帶有時區偏移量的日期和時間。可以使用 LocalDateTime
和 ZoneOffset
創建 OffsetDateTime
對象,例如:
val dateTime = LocalDateTime.of(2023, Month.MARCH, 7, 10, 0, 0)
val offset = ZoneOffset.of("+08:00")
val offsetDateTime = OffsetDateTime.of(dateTime, offset)
println("Offset date and time: $offsetDateTime")
15. ZonedDateTime
:用於表示帶有時區的日期和時間。可以使用 LocalDateTime
、ZoneId
和 ZoneOffset
創建 ZonedDateTime
對象,例如:
val dateTime = LocalDateTime.of(2023, Month.MARCH, 7, 10, 0, 0)
val zoneId = ZoneId.of("Asia/Taipei")
val zonedDateTime = ZonedDateTime.of(dateTime, zoneId)
println("Zoned date and time: $zonedDateTime")
16. ChronoUnit
:用於計算不同時間單位之間的差異。可以使用 ChronoUnit
的 between()
方法計算兩個日期或時間之間的差異,例如:
val start = LocalDateTime.of(2023, Month.MARCH, 7, 10, 0, 0)
val end = LocalDateTime.of(2023, Month.MARCH, 8, 12, 0, 0)
val hoursBetween = ChronoUnit.HOURS.between(start, end)
val minutesBetween = ChronoUnit.MINUTES.between(start, end)
println("Hours between: $hoursBetween, Minutes between: $minutesBetween")
17. TemporalAmount
:用於表示時間量,例如時間間隔或週期。可以使用 Duration
、Period
等類實現 TemporalAmount
接口,例如:
val duration = Duration.ofMinutes(30)
val period = Period.ofDays(1)
val dateTime = LocalDateTime.of(2023, Month.MARCH, 7, 10, 0, 0)
val newDateTime1 = dateTime.plus(duration)
val newDateTime2 = dateTime.plus(period)
println("New date and time (after duration): $newDateTime1")
println("New date and time (after period): $newDateTime2")
18. DateTimeFormatter
:用於格式化和解析日期和時間。可以使用靜態方法 DateTimeFormatter.ofPattern()
創建格式化對象,例如:
val dateTime = LocalDateTime.of(2023, Month.MARCH, 7, 10, 0, 0)
val formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")
val dateTimeStr = dateTime.format(formatter)
val newDateTime = LocalDateTime.parse(dateTimeStr, formatter)
println("Formatted date and time: $dateTimeStr")
println("Parsed date and time: $newDateTime")
19. YearMonth
:用於表示年和月,沒有具體的日期和時間。可以使用 YearMonth.now()
創建當前的年月對象,例如:
val yearMonth = YearMonth.now()
val year = yearMonth.year
val month = yearMonth.month
println("Current year and month: $year-$month")
20. MonthDay
:用於表示月和日,沒有具體的年份和時間。可以使用 MonthDay.now()
創建當前的月日對象,例如:
val monthDay = MonthDay.now()
val month = monthDay.month
val day = monthDay.dayOfMonth
println("Current month and day: $month-$day")
21. ZoneOffset
:用於表示時區偏移量。可以使用 ZoneOffset.of()
方法創建時區偏移量對象,例如:
val offset1 = ZoneOffset.of("+08:00")
val offset2 = ZoneOffset.ofHours(8)
val offset3 = ZoneOffset.UTC
println("Offsets: $offset1, $offset2, $offset3")
在 Android 中,可以通過 java.time
套件的大部分類別和方法來處理日期和時間。但是需要注意的是,java.time
套件是在 Android 8.0(API 級別 26)中添加的,因此在較舊的 Android 版本上可能無法使用。在這種情況下,可以使用 java.util
包中的類別和方法來處理日期和時間。
有一篇寫得蠻不錯的:Java 8的日期與時間(Date-Time)API (其他非由 ChatGPT 產生) 亦可以參考瀏覽,會更有助於理解 java.time
套件。
發佈留言