Travail avancé avec les dates et l'heure en Kotlin
Dans le développement moderne avec Kotlin, le travail avec les dates et l'heure va bien au-delà de l'affichage simple de la date actuelle. À un niveau avancé, il est nécessaire de prendre en compte les fuseaux horaires, d'effectuer des calculs complexes avec des périodes, d'analyser des formats non standard et de traiter des horodatages dans des systèmes distribués. Dans cet article, nous examinerons les bibliothèques et techniques clés qui vous aideront à écrire un code fiable et efficace pour travailler avec les dates et l'heure en Kotlin.
1. Choix de la bibliothèque : java.time vs kotlinx-datetime
Kotlin est entièrement compatible avec Java, vous pouvez donc utiliser la puissante API java.time (JSR-310), qui est la norme pour les nouveaux projets. Cependant, pour les projets multiplateformes (KMP), il est préférable de choisir kotlinx-datetime de JetBrains.
java.time (JVM)
Classes principales : 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("Réunion à Moscou : $zonedMeeting")}kotlinx-datetime (Multiplateforme)
Ajoutez la dépendance dans 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("Aujourd'hui : $date")}2. Analyse et formatage des dates
Une analyse correcte est la base du travail avec des données externes. Examinons des techniques avancées.
Analyse avec des formats non standard
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) { // essayer le suivant } } 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}Formatage localisé
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. Calculs complexes avec Duration et Period
Duration — pour les intervalles de temps précis (heures, minutes, secondes), Period — pour les périodes calendaires (années, mois, jours).
Différence entre dates avec prise en compte de la logique métier
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