在Kotlin中处理日期:库与工具概览
日期和时间的处理是任何应用程序中的关键任务之一:从事件记录到截止日期计算和日历显示。在Kotlin中,作为一种运行在JVM之上(并支持多平台项目)的语言,开发者可以使用多个强大的库。在本文中,我们将介绍三种主要方法:kotlinx-datetime(推荐用于多平台)、java.time(用于JVM/Android)和Joda-Time(传奇库,适用于旧项目)。
1. kotlinx-datetime — 官方多平台库
kotlinx-datetime 是JetBrains创建的现代库,专为Kotlin Multiplatform设计。它为所有平台(JVM、JS、Native)提供了统一的API,用于处理日期、时间、时区和持续时间。
安装 (Gradle)
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")}主要类与示例
Instant— 时间点 (UTC)。LocalDateTime— 不带时区的日期+时间。LocalDate— 仅日期。LocalTime— 仅时间。TimeZone— 时区。
import kotlinx.datetime.*
fun main() { // 当前UTC时间点 val now: Instant = Clock.System.now() println("Now UTC: $now")
// 转换为本地时间(系统时区) val localDateTime: LocalDateTime = now.toLocalDateTime(TimeZone.currentSystemDefault()) println("Local: $localDateTime")
// 处理日期 val today: LocalDate = localDateTime.date val tomorrow: LocalDate = today.plus(1, DateTimeUnit.DAY) println("Tomorrow: $tomorrow")
// 日期之间的差值 val daysBetween = tomorrow.daysUntil(today) println("Days between: $daysBetween") // -1
// 解析字符串 val parsedDate = LocalDate.parse("2025-03-15") println("Parsed: $parsedDate")}2. java.time (ThreeTen-Backport) — JVM和Android的标准
从Java 8开始,标准库中包含了java.time包 (JSR-310)。对于Android API < 26,使用ThreeTen-Backport(或用于Android的ThreeTenABP)。Kotlin与此API完全兼容。
安装 (适用于minSdk < 26的Android)
dependencies { implementation("org.threeten:threetenbp:1.6.9")}示例
import java.time.*
fun main() { // 当前日期和时间 val now = LocalDateTime.now() println("Now: $now")
// 创建特定日期 val date = LocalDate.of(2025, Month.DECEMBER, 25) println("Christmas: $date")
// 格式化 val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") val formatted = now.format(formatter) println("Formatted: $formatted")
// 日期之间的差值 val start = LocalDate.of(2025, 1, 1) val end = LocalDate.of(2025, 12, 31) val days = ChronoUnit.DAYS.between(start, end) println("Days in 2025: $days") // 364}3. Joda-Time — 久经考验的库
Joda-Time 在java.time出现之前是事实上的标准。如今它主要用于遗留项目。该库提供了丰富的功能,但被认为已过时——建议迁移到java.time或kotlinx-datetime。
安装
dependencies { implementation("joda-time:joda-time:2.12.7")}示例
import org.joda.time.*import org.joda.time.format.DateTimeFormat
fun main() { val now = DateTime.now() println("Now: $now")
// 添加