Travail avancé avec les dates et l'heure en Java : des bases au professionnalisme
\n\nLe travail avec les dates et l'heure est l'une des tâches clés de toute application d'entreprise. En Java, la norme a longtemps été l'encombrant java.util.Date et java.util.Calendar, mais avec la sortie de Java 8, la situation a radicalement changé. La nouvelle API java.time (JSR-310) a offert aux développeurs un ensemble d'outils puissant, thread-safe et intuitif. Dans cet article, nous allons examiner les techniques avancées de travail avec les dates et l'heure qui seront utiles à tout développeur Java.
1. Bases de l'API java.time : LocalDate, LocalTime, LocalDateTime
\n\nLa première étape vers un travail professionnel est la compréhension des trois classes de base qui ont remplacé les anciens équivalents :
\n\n- \n
- LocalDate — date sans heure (année, mois, jour). \n
- LocalTime — heure sans date (heures, minutes, secondes, nanosecondes). \n
- LocalDateTime — combinaison de la date et de l'heure sans référence à un fuseau horaire. \n
// Obtention de la date et de l'heure actuelles\nLocalDate today = LocalDate.now(); // 2025-03-21\nLocalTime now = LocalTime.now(); // 14:30:15.123\nLocalDateTime current = LocalDateTime.now(); // 2025-03-21T14:30:15.123\n\n// Création d'une date spécifique\nLocalDate birthDate = LocalDate.of(1990, Month.JUNE, 15);\nLocalTime meetingTime = LocalTime.of(10, 30, 0);\n\n// Manipulations de dates\nLocalDate nextWeek = today.plusWeeks(1);\nLocalDate lastMonth = today.minusMonths(1);\n\nCes classes sont immuables — toute opération renvoie un nouvel objet. Cela garantit la sécurité des threads et la prévisibilité du code.
\n\n2. Travail avec les fuseaux horaires : ZonedDateTime et ZoneId
\n\nLes applications globales ne peuvent pas ignorer les fuseaux horaires. Pour cela, l'API java.time propose la classe ZonedDateTime.
// Heure actuelle en UTC\nZonedDateTime utcNow = ZonedDateTime.now(ZoneOffset.UTC);\n\n// Heure dans un fuseau horaire spécifique\nZoneId moscowZone = ZoneId.of("Europe/Moscow");\nZonedDateTime moscowTime = ZonedDateTime.now(moscowZone);\n\n// Conversion entre fuseaux\nZonedDateTime nyTime = moscowTime.withZoneSameInstant(ZoneId.of("America/New_York"));\n\n// Obtention du décalage\nZoneOffset offset = moscowTime.getOffset(); // +03:00\n\nConseil de professionnel : stockez toujours les dates en UTC sur le serveur et convertissez-les dans le fuseau horaire local uniquement au niveau de la présentation (UI). Cela évitera les problèmes liés au passage à l'heure d'été/d'hiver.
\n\n3. Analyse et formatage des dates : DateTimeFormatter
\n\nL'une des tâches les plus courantes est la conversion d'une chaîne en date et vice versa. DateTimeFormatter offre des possibilités flexibles.
Formatage de base
\n\nDateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");\nLocalDateTime dateTime = LocalDateTime.parse("21.03.2025 14:30:00", formatter);\nString formatted = dateTime.format(formatter); // "21.03.2025 14:30:00"\n\nModèles avancés
\n\n// ISO-8601\nDateTimeFormatter isoFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;\nString isoDate = dateTime.format(isoFormatter); // "2025-03-21T14:30:00"\n\n// Formatage localisé\nDateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ITALY);\nString italianDate = dateTime.format(italianFormatter); // "21 marzo 2025"\n\n// Format personnalisé avec champs textuels\nDateTimeFormatter customFormatter = new DateTimeFormatterBuilder()\n .appendValue(ChronoField.YEAR)\n .appendLiteral(" année, ")\n .appendText(ChronoField.MONTH_OF_YEAR, TextStyle.FULL)\n .appendLiteral(" ")\n .appendValue(ChronoField.DAY_OF_MONTH)\n .toFormatter();\nString custom = dateTime.format(customFormatter); // "2025 année, mars 21"\n\nIl est important de se rappeler : DateTimeFormatter est également