Création d'une classe utilitaire de fuseau horaire
Dans cette dernière étape, vous allez créer une classe utilitaire réutilisable qui encapsule les opérations courantes de fuseau horaire. Cela démontrera comment appliquer les concepts que vous avez appris pour créer un outil pratique pour les applications du monde réel.
Construction d'un utilitaire de fuseau horaire réutilisable
Créons une classe utilitaire avec des méthodes pour les opérations courantes de fuseau horaire :
- Dans le WebIDE, créez un nouveau fichier dans le répertoire
/home/labex/project
- Nommez le fichier
TimeZoneUtil.java
- Ajoutez le code suivant :
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.ArrayList;
/**
* Utility class for common time zone operations.
*/
public class TimeZoneUtil {
// Common date time formatter
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
/**
* Converts a LocalDate to the same date in a specific time zone.
* Uses start of day (midnight) in the target zone.
*/
public static ZonedDateTime toZonedDateTime(LocalDate date, ZoneId zone) {
return date.atStartOfDay(zone);
}
/**
* Converts a date-time from one time zone to another,
* preserving the same instant in time.
*/
public static ZonedDateTime convertTimeZone(ZonedDateTime dateTime, ZoneId targetZone) {
return dateTime.withZoneSameInstant(targetZone);
}
/**
* Formats a ZonedDateTime object to a readable string.
*/
public static String format(ZonedDateTime dateTime) {
return dateTime.format(FORMATTER);
}
/**
* Determines if a date-time in one zone falls on a different date
* when converted to another zone.
*/
public static boolean dateChangeOccurs(ZonedDateTime dateTime, ZoneId targetZone) {
LocalDate originalDate = dateTime.toLocalDate();
LocalDate targetDate = convertTimeZone(dateTime, targetZone).toLocalDate();
return !originalDate.equals(targetDate);
}
/**
* Gets the current date-time in multiple time zones.
*/
public static List<ZonedDateTime> getCurrentDateTimeInZones(List<ZoneId> zones) {
Instant now = Instant.now();
List<ZonedDateTime> results = new ArrayList<>();
for (ZoneId zone : zones) {
results.add(now.atZone(zone));
}
return results;
}
}
- Maintenant, créez une classe de test pour démontrer l'utilitaire :
- Créez un nouveau fichier nommé
TimeZoneUtilDemo.java
- Ajoutez le code suivant :
import java.time.*;
import java.util.Arrays;
import java.util.List;
public class TimeZoneUtilDemo {
public static void main(String[] args) {
// Define time zones we want to work with
ZoneId newYorkZone = ZoneId.of("America/New_York");
ZoneId londonZone = ZoneId.of("Europe/London");
ZoneId tokyoZone = ZoneId.of("Asia/Tokyo");
// Demonstrate converting LocalDate to ZonedDateTime
LocalDate today = LocalDate.now();
System.out.println("Today's date: " + today);
ZonedDateTime todayInNewYork = TimeZoneUtil.toZonedDateTime(today, newYorkZone);
System.out.println("Today at midnight in New York: " + TimeZoneUtil.format(todayInNewYork));
// Demonstrate converting between time zones
ZonedDateTime todayInTokyo = TimeZoneUtil.convertTimeZone(todayInNewYork, tokyoZone);
System.out.println("Same instant in Tokyo: " + TimeZoneUtil.format(todayInTokyo));
// Demonstrate date change detection
ZonedDateTime eveningInNewYork = ZonedDateTime.of(
today, LocalTime.of(22, 0), newYorkZone);
boolean dateChanges = TimeZoneUtil.dateChangeOccurs(eveningInNewYork, tokyoZone);
System.out.println("\n10 PM in New York is on a different date in Tokyo: " + dateChanges);
// Show the actual times
System.out.println("New York: " + TimeZoneUtil.format(eveningInNewYork));
System.out.println("Tokyo: " + TimeZoneUtil.format(
TimeZoneUtil.convertTimeZone(eveningInNewYork, tokyoZone)));
// Demonstrate getting current time in multiple zones
System.out.println("\nCurrent time in different zones:");
List<ZoneId> zones = Arrays.asList(newYorkZone, londonZone, tokyoZone);
List<ZonedDateTime> currentTimes = TimeZoneUtil.getCurrentDateTimeInZones(zones);
for (int i = 0; i < zones.size(); i++) {
System.out.println(zones.get(i).getId() + ": " +
TimeZoneUtil.format(currentTimes.get(i)));
}
// Business use case: Meeting planning
System.out.println("\n--- Business Meeting Planning ---");
// Plan for a 2 PM meeting in New York
LocalDate meetingDate = LocalDate.now().plusDays(7); // Meeting next week
LocalTime meetingTime = LocalTime.of(14, 0); // 2 PM
ZonedDateTime meetingInNewYork = ZonedDateTime.of(meetingDate, meetingTime, newYorkZone);
System.out.println("Meeting scheduled for: " + TimeZoneUtil.format(meetingInNewYork));
System.out.println("For attendees in London: " +
TimeZoneUtil.format(TimeZoneUtil.convertTimeZone(meetingInNewYork, londonZone)));
System.out.println("For attendees in Tokyo: " +
TimeZoneUtil.format(TimeZoneUtil.convertTimeZone(meetingInNewYork, tokyoZone)));
// Check for date changes
boolean londonDateChange = TimeZoneUtil.dateChangeOccurs(meetingInNewYork, londonZone);
boolean tokyoDateChange = TimeZoneUtil.dateChangeOccurs(meetingInNewYork, tokyoZone);
if (londonDateChange) {
System.out.println("Note: The meeting is on a different date in London!");
}
if (tokyoDateChange) {
System.out.println("Note: The meeting is on a different date in Tokyo!");
}
}
}
- Enregistrez les deux fichiers
Maintenant, compilons et exécutons la démonstration :
cd ~/project
javac TimeZoneUtil.java TimeZoneUtilDemo.java
java TimeZoneUtilDemo
Vous devriez voir une sortie similaire à celle-ci :
Today's date: 2023-10-23
Today at midnight in New York: 2023-10-23 00:00:00 EDT
Same instant in Tokyo: 2023-10-23 13:00:00 JST
10 PM in New York is on a different date in Tokyo: true
New York: 2023-10-23 22:00:00 EDT
Tokyo: 2023-10-24 11:00:00 JST
Current time in different zones:
America/New_York: 2023-10-23 13:45:23 EDT
Europe/London: 2023-10-23 18:45:23 BST
Asia/Tokyo: 2023-10-24 02:45:23 JST
--- Business Meeting Planning ---
Meeting scheduled for: 2023-10-30 14:00:00 EDT
For attendees in London: 2023-10-30 18:00:00 GMT
For attendees in Tokyo: 2023-10-31 03:00:00 JST
Note: The meeting is on a different date in Tokyo!
Avantages de la classe utilitaire
La classe TimeZoneUtil offre plusieurs avantages :
- Encapsulation : Les opérations courantes de fuseau horaire sont encapsulées dans une seule classe
- Réutilisabilité : Les méthodes peuvent être réutilisées dans différentes parties d'une application
- Maintenabilité : Les modifications de la gestion des fuseaux horaires peuvent être effectuées en un seul endroit
- Lisibilité : Le code qui utilise la classe utilitaire est plus propre et plus ciblé
Applications du monde réel
Cette classe utilitaire peut être utile dans de nombreux scénarios du monde réel :
- Applications commerciales internationales : Gestion des réunions, des délais et des heures de travail entre les fuseaux horaires
- Applications de voyage : Calcul des heures d'arrivée des vols et des fenêtres de réservation
- Gestion d'événements mondiaux : Planification et programmation d'événements pour les participants dans différents fuseaux horaires
- Commerce électronique : Gestion des heures limites de commande, des dates de livraison et des fenêtres d'expédition
Points clés à retenir
Dans ce lab, vous avez appris à :
- Travailler avec l'API Java Time pour la gestion des fuseaux horaires
- Créer et manipuler des objets
LocalDate
- Appliquer des fuseaux horaires aux dates à l'aide de
ZonedDateTime
- Convertir entre différents fuseaux horaires
- Gérer les changements de date entre fuseaux horaires
- Créer une classe utilitaire réutilisable pour les opérations de fuseau horaire
Ces compétences vous aideront à créer des applications Java robustes qui gèrent correctement les dates et les heures dans différents fuseaux horaires.