【筆記】java.time 套件介紹… (By ChatGPT)

Java 8 引入了一個新的日期時間 API,稱為 java.time 套件,它提供了一組新的類別,用於更簡單、更強大、更安全地處理日期和時間。java.time 套件旨在取代舊的 java.util.Datejava.util.Calendarjava.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 套件中的部分類別和方法,還有很多其他有用的類別和方法,例如 YearMonthMonthDayTemporalAdjusterTemporalQuery 等。使用 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 套件中的一部分,還有很多其他有用的類別和方法,例如 YearMonthMonthDayZoneOffsetDateTimeParseException 等。使用 java.time 套件可以更加方便、安全和高效地處理日期和時間相關的問題。


14. OffsetDateTime:用於表示帶有時區偏移量的日期和時間。可以使用 LocalDateTimeZoneOffset 創建 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:用於表示帶有時區的日期和時間。可以使用 LocalDateTimeZoneIdZoneOffset 創建 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:用於計算不同時間單位之間的差異。可以使用 ChronoUnitbetween() 方法計算兩個日期或時間之間的差異,例如:

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:用於表示時間量,例如時間間隔或週期。可以使用 DurationPeriod 等類實現 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 套件。


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *