在 Kotlin 中处理日期和时间:高级技术与 API

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kotlin 中高级处理日期和时间



在现代 Kotlin 开发中,日期和时间的处理远不止简单地输出当前日期。在高级层面,需要考虑时区、执行复杂的周期计算、解析非标准格式以及处理分布式系统中的时间戳。在本文中,我们将介绍关键的库和技术,帮助您编写可靠且高效的 Kotlin 日期和时间处理代码。



1. 库的选择:java.time vs kotlinx-datetime



Kotlin 与 Java 完全兼容,因此您可以使用强大的 java.time API(JSR-310),它是新项目的标准。然而,对于跨平台项目(KMP),最好选择 JetBrains 的 kotlinx-datetime。



java.time (JVM)

主要类:LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Instant、Duration、Period。



import java.time.*

fun main() { val today = LocalDate.now() val meetingTime = LocalDateTime.of(2025, 3, 15, 14, 30) val zonedMeeting = ZonedDateTime.of(meetingTime, ZoneId.of("Europe/Moscow")) println("莫斯科会议时间: $zonedMeeting")}


kotlinx-datetime (跨平台)

在 build.gradle.kts 中添加依赖:

implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")


import kotlinx.datetime.*

fun main() { val now = Clock.System.now() val date = now.toLocalDateTime(TimeZone.of("Europe/Moscow")).date println("今天: $date")}


2. 日期的解析与格式化



正确的解析是处理外部数据的基础。让我们来看一些高级技巧。



解析非标准格式



import java.time.LocalDateTimeimport java.time.format.DateTimeFormatterimport java.time.format.DateTimeParseException

fun parseCustomDate(dateString: String): LocalDateTime? { val formatters = listOf( DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), DateTimeFormatter.ofPattern("dd/MM/yyyy'T'HH:mm"), DateTimeFormatter.ISO_LOCAL_DATE_TIME ) for (formatter in formatters) { try { return LocalDateTime.parse(dateString, formatter) } catch (e: DateTimeParseException) { // 尝试下一个 } } return null}

fun main() { println(parseCustomDate("2025-03-15 14:30:00")) // 2025-03-15T14:30 println(parseCustomDate("15/03/2025T14:30")) // 2025-03-15T14:30}


本地化格式化



import java.time.LocalDateimport java.time.format.DateTimeFormatterimport java.time.format.FormatStyleimport java.util.Locale

fun main() { val date = LocalDate.of(2025, 3, 15) val usFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale.US) val ruFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale("ru")) println("美国: ${date.format(usFormatter)}") // Saturday, March 15, 2025 println("俄罗斯: ${date.format(ruFormatter)}") // суббота, 15 марта 2025 г.}


3. 使用 Duration 和 Period 进行复杂计算



Duration — 用于精确的时间间隔(小时、分钟、秒),Period — 用于日历周期(年、月、日)。



考虑业务逻辑的日期差计算



import java.time.*import java.time.temporal.ChronoUnit

fun businessDaysBetween(start: LocalDate, end: LocalDate): Long { var count = 0L var current = start while (current.isBefore(end)) { if (current.dayOfWeek != DayOfWeek.SATURDAY && current.dayOfWeek != DayOfWe

博客

书籍推荐