[筆記] Java/Kotlin 中的日期與時間
阿新 • • 發佈:2020-06-30
整理編碼中遇到的常用日期與時間操作,供參考。
1 Date
2 LocalDateTime,LocalDate,LocalTime
3 ZonedDateTime
4 Instant
5 java.sql Date Time TimeStamp
P.S. 以下均為 kotlin 程式碼。
1 Date
Date 執行緒不安全,已經不建議使用。
親,建議你使用LocalDateTime而不是Date哦 - 掘金
// Date 同時包含日期和時間 val date1 = Date(); // 當前時間 val millisencond = date1.time // 時間戳,毫秒 val date2 = Date(millisencond) // 使用時間戳(毫秒)構建時間
Date 的格式化,與 SimpleDateFormat 搭配使用。
// Date 格式化輸出
val s1 = date1.toString() // Tue Jun 30 11:01:03 CST 2020
val f1 = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
val s2 = f1.format(date1) // 2020-06-30 11:00:26.401
2 LocalDateTime,LocalDate,LocalTime
// 總是以當前預設時區返回
val d = LocalDate.now() // 當前日期
val t = LocalTime.now() // 當前時間
val dt = LocalDateTime.now() // 當前日期和時間
val dtUtc = LocalDateTime.now(ZoneOffset.UTC) // UTC時間:2020-06-30T03:32:41.313
格式化與 DateTimeFormatter 搭配使用。
// 自定義格式化: val myDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS") println("DateTimeFormatter 自定義格式化: ${myDateTimeFormatter.format(LocalDateTime.now())} // 用自定義格式解析: val dt2 = LocalDateTime.parse("2019/11/30 15:16:17.123", myDateTimeFormatter) println("DateTimeFormatter 用自定義格式解析: $dt2")
3 ZonedDateTime
帶時區資訊的 DateTime
val zdt = ZonedDateTime.now() // 當前日期時間:2020-06-30T11:33:20.539+08:00[Asia/Shanghai]
val zdt2 = ZonedDateTime.now().withZoneSameInstant(ZoneOffset.UTC) // UTC時間:2020-06-30T03:34:09.939Z
4 Instant (時間戳)
val timestamp = Instant.now()
println("時間戳(秒): ${timestamp.epochSecond}") // 時間戳,秒
println("時間戳(毫秒): ${timestamp.toEpochMilli()}") // 時間戳,毫秒
println("時間戳(毫秒): ${System.currentTimeMillis()}") // 使用 System 獲取時間戳,毫秒
5 sql time/date/timestamp
都是繼承自 java.util.Date 類,用於資料庫時間操作。
基本的使用與 java.util.Date 一致。
- java.sql.Date、java.sql.Time、java.sql.TimeStamp真的有區別嗎? - 一夢、 - 部落格園
- [Java]java.sql.Timestamp(時間戳)_YOLO-CSDN部落格_java.sql.timestamp
轉換
// Instant -> Timestamp(SQL)
val sqlTimestamp = Timestamp.from(timestamp)
// LocalDateTime -> Timestamp(SQL)
val sqlTimestamp2 = Timestamp.valueOf(LocalDateTime.now())
// Timestamp(SQL) -> LocalDateTime
val localDateTime1 = LocalDateTime.ofInstant(Instant.ofEpochMilli(sqlTimestamp.time), ZoneOffset.UTC)
val localDateTime2 = LocalDateTime.ofInstant(Instant.ofEpochMilli(sqlTimestamp.time), ZoneId.systemDefault())
轉換
轉換的基本邏輯,都是以時間戳為中間資料。部分情況需要注意時區的問題。
// Date -> LocalDateTime
val localDateTime = LocalDateTime.ofInstant(Date().toInstant(), ZoneId.systemDefault())
// LocalDateTime -> Date
val date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant())
其它
還有 Duration 和 Period,用於表示時間段,可以看這裡:
- 週期和持續時間 / Period and Duration | JAVA8 官網筆記教程
- LocalDateTime - 廖雪峰的官方網站
- Java 8新特性(四):新的時間和日期API | 一書生VOID的部落格
時區與偏移: