Introduction
La gestion des dates et des heures est l'une des tâches les plus courantes dans le développement moderne. Qu'il s'agisse de journalisation d'événements, de calcul de délais, d'affichage de calendrier ou d'internationalisation d'application, le développeur Kotlin doit savoir traiter correctement les données temporelles. Dans cet article, nous allons détailler comment travailler avec les dates et les heures en Kotlin, en utilisant l'API moderne java.time, disponible depuis Java 8 et entièrement compatible avec Kotlin. Vous découvrirez les classes clés, le formatage, l'analyse, la gestion des fuseaux horaires et des exemples pratiques qui vous aideront à écrire un code propre et fiable.
Classes principales pour travailler avec les dates et les heures
En Kotlin, comme en Java, le travail principal avec les dates et les heures repose sur le package java.time. Ce package a été créé pour remplacer les obsolètes java.util.Date et java.util.Calendar. Il propose des classes immuables et thread-safe. Examinons les plus importantes.
LocalDate — date sans heure
La classe LocalDate représente une date (année, mois, jour) sans tenir compte de l'heure ni du fuseau horaire. Idéale pour les anniversaires, les jours fériés ou les dates d'événements.
import java.time.LocalDate
fun main() {
// Date actuelle
val today: LocalDate = LocalDate.now()
println("Aujourd'hui: $today") // Affichage : 2025-04-11
// Date spécifique
val specificDate: LocalDate = LocalDate.of(2025, 12, 25)
println("Noël: $specificDate")
// Ajout de jours
val nextWeek: LocalDate = today.plusDays(7)
println("Dans une semaine: $nextWeek")
}
LocalTime — heure sans date
Si vous avez besoin uniquement de l'heure (heures, minutes, secondes, nanosecondes), utilisez LocalTime.
import java.time.LocalTime
fun main() {
val now: LocalTime = LocalTime.now()
println("Heure actuelle: $now")
val meetingTime: LocalTime = LocalTime.of(14, 30)
println("Réunion à: $meetingTime")
val oneHourLater: LocalTime = now.plusHours(1)
println("Dans une heure: $oneHourLater")
}
LocalDateTime — date et heure ensemble
C'est une combinaison de LocalDate et LocalTime. La classe la plus populaire pour stocker un instant sans lien avec un fuseau horaire.
import java.time.LocalDateTime
fun main() {
val currentDateTime: LocalDateTime = LocalDateTime.now()
println("Maintenant: $currentDateTime")
val newYear: LocalDateTime = LocalDateTime.of(2026, 1, 1, 0, 0)
println("Nouvel an: $newYear")
}
ZonedDateTime et Instant — travail avec les fuseaux horaires
ZonedDateTime ajoute à LocalDateTime des informations sur le fuseau horaire (ZoneId). Instant représente un instant en UTC (temps machine).
import java.time.ZonedDateTime
import java.time.ZoneId
import java.time.Instant
fun main() {
// Heure dans un fuseau horaire spécifique
val moscowTime: ZonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"))
println("Heure à Moscou: $moscowTime")
// Instant actuel en UTC
val instant: Instant = Instant.now()
println("Horodatage UTC: $instant")
}
Formatage et analyse des dates
Pour convertir une date en chaîne (formatage) et une chaîne en date (analyse), on utilise la classe DateTimeFormatter. Elle permet de définir n'importe quel modèle.
Formatage d'une date en chaîne
import java.time.LocalDate
import java.time.format.DateTimeFormatter
fun main() {
val date = LocalDate.now()
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formattedDate: String = date.format(formatter)
println("Date formatée: $formattedDate") // Affichage : 11.04.2025
// Autres exemples de modèles
val formatter2 = DateTimeFormat