Arbeiten mit Datum und Uhrzeit in Kotlin: fortgeschrittene Techniken und Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittene Arbeit mit Datum und Uhrzeit in Kotlin

\n\n

In der modernen Kotlin-Entwicklung ist die korrekte Verarbeitung von Datum und Uhrzeit nicht nur eine Annehmlichkeit, sondern eine Notwendigkeit. Auf fortgeschrittenem Niveau muss sich der Entwickler mit Zeitzonen, Perioden, Dauern und komplexen Formatierungsoperationen befassen. In diesem Artikel betrachten wir die wichtigsten Werkzeuge und Techniken, die Ihnen helfen, zuverlässigen und effizienten Code zu schreiben.

\n\n

1. Grundlegende Klassen: LocalDate, LocalTime, LocalDateTime und Instant

\n\n

Kotlin erbt vollständig die leistungsstarke Bibliothek java.time (JSR-310), die zum Standard für die Arbeit mit Datum und Uhrzeit in Java 8 und höher geworden ist. Für Kotlin Multiplatform gibt es die Bibliothek kotlinx-datetime, aber im Rahmen von JVM-Projekten bleibt java.time am weitesten verbreitet.

\n\n

LocalDate, LocalTime, LocalDateTime

\n

Diese Klassen repräsentieren Datum und Uhrzeit ohne Bindung an eine Zeitzone. Sie sind ideal für die Speicherung von Geburtstagen, Zeitplänen und anderen Daten, bei denen die Zeitzone unwichtig ist.

\n\n
import java.time.LocalDate\nimport java.time.LocalTime\nimport java.time.LocalDateTime\n\nfun main() {\n    val date = LocalDate.now()\n    val time = LocalTime.of(14, 30, 0)\n    val dateTime = LocalDateTime.of(date, time)\n    \n    println("Datum: $date")\n    println("Uhrzeit: $time")\n    println("Datum und Uhrzeit: $dateTime")\n    \n    // Addition und Subtraktion von Tagen\n    val tomorrow = date.plusDays(1)\n    println("Morgen: $tomorrow")\n}
\n\n

Instant — Zeitstempel für Maschinen

\n

Instant repräsentiert einen Punkt auf der Zeitachse in UTC. Er ist unverzichtbar für das Logging, den Datenaustausch zwischen Servern und die Arbeit mit APIs.

\n\n
import java.time.Instant\n\nfun main() {\n    val now = Instant.now()\n    println("Aktueller Moment in UTC: $now")\n    \n    // Konvertierung aus Millisekunden\n    val fromEpoch = Instant.ofEpochMilli(1_700_000_000_000)\n    println("Aus Millisekunden: $fromEpoch")\n}
\n\n

2. Zeitzonen: ZonedDateTime und OffsetDateTime

\n\n

Wenn eine Anwendung mit Benutzern aus verschiedenen Regionen arbeitet, müssen Zeitzonen berücksichtigt werden. Dafür gibt es ZonedDateTime (mit vollständigen Zoneninformationen) und OffsetDateTime (nur Abweichung von UTC).

\n\n
import java.time.ZonedDateTime\nimport java.time.ZoneId\nimport java.time.ZoneOffset\n\nfun main() {\n    // Aktuelle Uhrzeit in New York\n    val newYork = ZonedDateTime.now(ZoneId.of("America/New_York"))\n    println("New York: $newYork")\n    \n    // Umrechnung von UTC\n    val utcNow = ZonedDateTime.now(ZoneOffset.UTC)\n    val moscowTime = utcNow.withZoneSameInstant(ZoneId.of("Europe/Moscow"))\n    println("Moskau: $moscowTime")\n    \n    // OffsetDateTime für einfache Abweichungen\n    val offsetTime = java.time.OffsetDateTime.now(ZoneOffset.ofHours(3))\n    println("+3 Stunden: $offsetTime")\n}
\n\n

Wichtig: Für die Benutzeroberfläche verwenden Sie immer ZonedDateTime, um die Sommer-/Winterzeitumstellung korrekt zu handhaben. OffsetDateTime eignet sich für feste Abweichungen, z. B. bei der Arbeit mit Logs.

\n\n

3. Unterschied zwischen Daten: Period und Duration

\n\n

Zur Berechnung von Zeitunterschieden bietet Kotlin zwei Klassen: Period (für Daten, in Tagen/Monaten/Jahren) und Duration (für genaue Intervalle in Sekunden/Nanosekunden).

\n\n

Period — Arbeit mit Kalendereinheiten

\n
import java.time.LocalDate\nimport java.time.Period\n\nfun main() {\n    val birthDate = LocalDate.of(1990, 5, 15)\n    val today = LocalDate.now()\n    val age = Period.between(birthDate, today)\n    \n    println("Alter: ${age.years} Jahre, ${age.months} Monate, ${age.days} Tage")\n    \n    // Hinzufügen einer Periode zu einem Datum\n    val nextMonth = today.plus(Period.ofMonths(1))\n    println("In einem Monat: $nextMonth")\n}
\n\n

Duration — genaue Intervalle<

Blogs

Buchempfehlungen