Travail avancé avec les dates et l'heure en Kotlin
\n\nDans le développement moderne avec Kotlin, une gestion correcte des dates et de l'heure n'est pas seulement une commodité, mais une nécessité. À un niveau avancé, le développeur doit traiter les fuseaux horaires, les périodes, les durées et les opérations complexes de formatage. Dans cet article, nous examinerons les outils et techniques clés qui vous aideront à écrire un code fiable et efficace.
\n\n1. Classes principales : LocalDate, LocalTime, LocalDateTime et Instant
\n\nKotlin hérite entièrement de la puissante bibliothèque java.time (JSR-310), qui est devenue la norme pour le travail avec les dates et l'heure en Java 8 et versions ultérieures. Pour Kotlin Multiplatform, il existe la bibliothèque kotlinx-datetime, mais dans le cadre des projets JVM, java.time reste la plus populaire.
LocalDate, LocalTime, LocalDateTime
\nCes classes représentent une date et une heure sans lien avec un fuseau horaire. Elles sont idéales pour stocker les anniversaires, les horaires et autres données où le fuseau horaire n'est pas important.
\n\nimport 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("Date : $date")\n println("Heure : $time")\n println("Date et heure : $dateTime")\n \n // Addition et soustraction de jours\n val tomorrow = date.plusDays(1)\n println("Demain : $tomorrow")\n}\n\nInstant — horodatage pour les machines
\nInstant représente un point sur la ligne temporelle en UTC. Il est indispensable pour la journalisation, l'échange de données entre serveurs et le travail avec les API.
import java.time.Instant\n\nfun main() {\n val now = Instant.now()\n println("Moment actuel en UTC : $now")\n \n // Conversion à partir de millisecondes\n val fromEpoch = Instant.ofEpochMilli(1_700_000_000_000)\n println("À partir des millisecondes : $fromEpoch")\n}\n\n2. Fuseaux horaires : ZonedDateTime et OffsetDateTime
\n\nLorsque l'application travaille avec des utilisateurs de différentes régions, il est nécessaire de prendre en compte les fuseaux horaires. Pour cela, il existe ZonedDateTime (avec des informations complètes sur la zone) et OffsetDateTime (uniquement le décalage par rapport à UTC).
import java.time.ZonedDateTime\nimport java.time.ZoneId\nimport java.time.ZoneOffset\n\nfun main() {\n // Heure actuelle à New York\n val newYork = ZonedDateTime.now(ZoneId.of("America/New_York"))\n println("New York : $newYork")\n \n // Conversion depuis UTC\n val utcNow = ZonedDateTime.now(ZoneOffset.UTC)\n val moscowTime = utcNow.withZoneSameInstant(ZoneId.of("Europe/Moscow"))\n println("Moscou : $moscowTime")\n \n // OffsetDateTime pour les décalages simples\n val offsetTime = java.time.OffsetDateTime.now(ZoneOffset.ofHours(3))\n println("+3 heures : $offsetTime")\n}\n\nImportant : Pour l'interface utilisateur, utilisez toujours ZonedDateTime afin de gérer correctement le passage à l'heure d'été/d'hiver. OffsetDateTime convient pour les décalages fixes, par exemple lors du travail avec des journaux.
3. Différence entre les dates : Period et Duration
\n\nPour calculer la différence de temps, Kotlin fournit deux classes : Period (pour les dates, en jours/mois/années) et Duration (pour les intervalles précis en secondes/nanosecondes).
Period — travail avec les unités calendaires
\nimport 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("Âge : ${age.years} ans, ${age.months} mois, ${age.days} jours")\n \n // Ajout d'une période à une date\n val nextMonth = today.plus(Period.ofMonths(1))\n println("Dans un mois : $nextMonth")\n}\n\n