Fortgeschrittene Arbeit mit Datum und Zeit in Kotlin
In der modernen Kotlin-Entwicklung geht die Arbeit mit Datum und Zeit weit über die bloße Anzeige des aktuellen Datums hinaus. Auf fortgeschrittenem Niveau müssen Zeitzonen berücksichtigt, komplexe Berechnungen mit Perioden durchgeführt, nicht standardisierte Formate geparst und Zeitstempel in verteilten Systemen verarbeitet werden. In diesem Artikel werden wir die wichtigsten Bibliotheken und Techniken betrachten, die Ihnen helfen, zuverlässigen und effizienten Code für die Arbeit mit Datum und Zeit in Kotlin zu schreiben.
1. Bibliotheksauswahl: java.time vs kotlinx-datetime
Kotlin ist vollständig kompatibel mit Java, daher können Sie die leistungsstarke java.time API (JSR-310) verwenden, die der Standard für neue Projekte ist. Für plattformübergreifende Projekte (KMP) ist jedoch kotlinx-datetime von JetBrains die bessere Wahl.
java.time (JVM)
Hauptklassen: 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("Meeting in Moscow: $zonedMeeting")}kotlinx-datetime (Multiplattform)
Fügen Sie die Abhängigkeit in build.gradle.kts hinzu:
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("Today: $date")}2. Parsen und Formatieren von Daten
Korrektes Parsen ist die Grundlage für die Arbeit mit externen Daten. Betrachten wir fortgeschrittene Techniken.
Parsen mit nicht standardisierten Formaten
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) { // try the next one } } 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}Lokalisiertes Formatieren
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("USA: ${date.format(usFormatter)}") // Saturday, March 15, 2025 println("RU: ${date.format(ruFormatter)}") // суббота, 15 марта 2025 г.}3. Komplexe Berechnungen mit Duration und Period
Duration — für präzise Zeitintervalle (Stunden, Minuten, Sekunden), Period — für Kalenderperioden (Jahre, Monate, Tage).
Differenz zwischen Daten unter Berücksichtigung der Geschäftslogik
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