Kotlin 日期和时间处理入门
日期和时间处理是现代开发中最常见的任务之一。无论是事件日志记录、期限计算、任务调度还是用户界面显示,都离不开对时间戳的妥善处理。在与 Java 完全兼容的 Kotlin 中,事实上的标准是 Java 8 引入的 java.time 包。该包取代了过时的 java.util.Date 和 java.util.Calendar,提供了线程安全、不可变且直观的 API。
本文将详细讲解 Kotlin 中日期和时间处理的所有关键方面:从对象创建到格式化、解析以及执行算术运算。您将通过实际示例学习如何使用 LocalDate、LocalTime、LocalDateTime、Instant、Duration 和 Period。
1. 日期和时间处理的核心类
java.time 包包含几个关键类,每个类都解决特定问题。下面我们来详细了解它们。
1.1 LocalDate —— 处理不含时间的日期
LocalDate 类表示日期(年、月、日),不包含时间和时区。它非常适合表示生日、日历事件以及不绑定到特定时刻的日期。
import java.time.LocalDate
fun main() { // 当前日期 val today = LocalDate.now() println("今天: $today") // 2025-04-05
// 指定日期 val newYear = LocalDate.of(2025, 1, 1) println("新年: $newYear")
// 从字符串解析 val parsedDate = LocalDate.parse("2025-12-31") println("解析日期: $parsedDate")}1.2 LocalTime —— 处理不含日期的时间
LocalTime 仅存储时间(小时、分钟、秒、纳秒)。它适用于存储工作日开始时间、日程安排或计时器。
import java.time.LocalTime
fun main() { // 当前时间 val now = LocalTime.now() println("现在: $now")
// 指定时间 val meetingTime = LocalTime.of(14, 30, 0) println("会议时间: $meetingTime")
// 解析 val parsedTime = LocalTime.parse("09:15:30") println("解析时间: $parsedTime")}1.3 LocalDateTime —— 日期和时间的组合
LocalDateTime 结合了 LocalDate 和 LocalTime。这是存储不带时区的时间点最常用的类。
import java.time.LocalDateTime
fun main() { // 当前日期和时间 val current = LocalDateTime.now() println("现在: $current")
// 从组件创建 val specific = LocalDateTime.of(2025, 4, 5, 10, 30, 0) println("指定时刻: $specific")
// 组合日期和时间 val date = LocalDate.of(2025, 12, 25) val time = LocalTime.of(18, 0) val christmas = LocalDateTime.of(date, time) println("圣诞节: $christmas")}1.4 Instant —— UTC 时间点
Instant 以 Unix 时间戳格式(自 1970 年 1 月 1 日以来的秒数和纳秒数)表示时间轴上的一个点。它对于存储日志、与数据库交互以及系统间数据交换不可或缺。
import java.time.Instant
fun main() { // 当前 UTC 时间 val now = Instant.now() println("现在 (UTC): $now")
// 从 Unix 时间戳创建 val fromEpoch = Instant.ofEpochSecond(1_700_000_000) println("从时间戳创建: $fromEpoch")
// 转换为毫秒 val millis = now.toEpochMilli() println("毫秒数: $millis")}2. 日期和时间的格式化与解析
为了将日期转换为字符串