Travail avec les dates et l'heure en Kotlin : techniques avancées et exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travail avancé avec les dates et l'heure en Kotlin

\n\n

Dans 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\n

1. Classes principales : LocalDate, LocalTime, LocalDateTime et Instant

\n\n

Kotlin 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.

\n\n

LocalDate, LocalTime, LocalDateTime

\n

Ces 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\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("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\n

Instant — horodatage pour les machines

\n

Instant 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.

\n\n
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\n

2. Fuseaux horaires : ZonedDateTime et OffsetDateTime

\n\n

Lorsque 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).

\n\n
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\n

Important : 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.

\n\n

3. Différence entre les dates : Period et Duration

\n\n

Pour 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).

\n\n

Period — travail avec les unités calendaires

\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("Â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

Duration — intervalles précis<

Blogs

Book Recommendations