Afficher tous les fuseaux horaires avec GMT et UTC en Java

1. Vue d'ensemble

Chaque fois que nous traitons des heures et des dates, nous avons besoin d'un cadre de référence. La norme pour cela est UTC, mais nous voyons également GMT dans certaines applications.

En bref, UTC est la norme, tandis que GMT est un fuseau horaire.

Voici ce que Wikipedia nous dit sur ce qu'il faut utiliser:

Dans la plupart des cas, UTC est considéré comme interchangeable avec le temps moyen de Greenwich (GMT), mais GMT n'est plus défini avec précision par la communauté scientifique.

En d'autres termes, une fois que nous avons compilé une liste avec des décalages de fuseau horaire en UTC, nous l'aurons également pour GMT.

Tout d'abord, nous allons examiner la manière dont Java 8 y parvient, puis nous verrons comment nous pouvons obtenir le même résultat en Java 7.

2. Obtention d'une liste de zones

Pour commencer, nous devons récupérer une liste de tous les fuseaux horaires définis.

À cette fin, la classe ZoneId a une méthode statique pratique:

Set availableZoneIds = ZoneId.getAvailableZoneIds();

Ensuite, nous pouvons utiliser l' ensemble pour générer une liste triée de fuseaux horaires avec leurs décalages correspondants:

public List getTimeZoneList(OffsetBase base) { LocalDateTime now = LocalDateTime.now(); return ZoneId.getAvailableZoneIds().stream() .map(ZoneId::of) .sorted(new ZoneComparator()) .map(id -> String.format( "(%s%s) %s", base, getOffset(now, id), id.getId())) .collect(Collectors.toList()); }

La méthode ci-dessus utilise un paramètre enum qui représente le décalage que nous voulons voir:

public enum OffsetBase { GMT, UTC }

Passons maintenant en revue le code plus en détail.

Une fois que nous avons récupéré tous les ID de zone disponibles, nous avons besoin d'une référence de temps réel, représentée par LocalDateTime.now ().

Après cela, nous utilisons l' API Stream de Java pour itérer sur chaque entrée de notre ensemble d' identificateurs de chaîne de fuseau horaire et la transformer en une liste de fuseaux horaires formatés avec le décalage correspondant.

Pour chacune de ces entrées, nous générons une instance de ZoneId avec map (ZoneId :: of).

3. Obtenir des décalages

Nous devons également trouver les décalages UTC réels. Par exemple, dans le cas de l'heure d'Europe centrale, le décalage serait de +01: 00.

Pour obtenir le décalage UTC pour une zone donnée, nous pouvons utiliser la méthode getOffset () de LocalDateTime .

Notez également que Java représente +00: 00 décalages comme Z .

Donc, pour avoir une chaîne de recherche cohérente pour les fuseaux horaires avec le décalage zéro, nous remplacerons Z par +00: 00:

private String getOffset(LocalDateTime dateTime, ZoneId id) { return dateTime .atZone(id) .getOffset() .getId() .replace("Z", "+00:00"); }

4. Rendre les zones comparables

En option, nous pouvons également trier les fuseaux horaires en fonction du décalage.

Pour cela, nous utiliserons une classe ZoneComparator :

private class ZoneComparator implements Comparator { @Override public int compare(ZoneId zoneId1, ZoneId zoneId2) { LocalDateTime now = LocalDateTime.now(); ZoneOffset offset1 = now.atZone(zoneId1).getOffset(); ZoneOffset offset2 = now.atZone(zoneId2).getOffset(); return offset1.compareTo(offset2); } }

5. Affichage des fuseaux horaires

Il ne reste plus qu'à rassembler les éléments ci-dessus en appelant la méthode getTimeZoneList () pour chaque valeur d' énumération OffsetBase et en affichant les listes:

public class TimezoneDisplayApp { public static void main(String... args) { TimezoneDisplay display = new TimezoneDisplay(); System.out.println("Time zones in UTC:"); List utc = display.getTimeZoneList( TimezoneDisplay.OffsetBase.UTC); utc.forEach(System.out::println); System.out.println("Time zones in GMT:"); List gmt = display.getTimeZoneList( TimezoneDisplay.OffsetBase.GMT); gmt.forEach(System.out::println); } }

Lorsque nous exécutons le code ci-dessus, il imprimera les fuseaux horaires pour UTC et GMT.

Voici un extrait de ce à quoi ressemblera la sortie:

Time zones in UTC: (UTC+14:00) Pacific/Apia (UTC+14:00) Pacific/Kiritimati (UTC+14:00) Pacific/Tongatapu (UTC+14:00) Etc/GMT-14

6. Java 7 et versions antérieures

Java 8 facilite cette tâche en utilisant les API Stream et Date et heure .

Cependant, si nous avons un Java 7 et avant un projet, nous pouvons toujours obtenir le même résultat en nous appuyant sur la classe java.util.TimeZone avec sa méthode getAvailableIDs () :

public List getTimeZoneList(OffsetBase base) { String[] availableZoneIds = TimeZone.getAvailableIDs(); List result = new ArrayList(availableZoneIds.length); for (String zoneId : availableZoneIds) { TimeZone curTimeZone = TimeZone.getTimeZone(zoneId); String offset = calculateOffset(curTimeZone.getRawOffset()); result.add(String.format("(%s%s) %s", base, offset, zoneId)); } Collections.sort(result); return result; }

La principale différence avec le code Java 8 est le calcul du décalage.

Le rawOffset nous obtenons de TimeZone () de » getRawOffset () méthode exprime décalage en millisecondes de fuseau horaire .

Par conséquent, nous devons convertir cela en heures et minutes à l'aide de la classe TimeUnit :

private String calculateOffset(int rawOffset) { if (rawOffset == 0) { return "+00:00"; } long hours = TimeUnit.MILLISECONDS.toHours(rawOffset); long minutes = TimeUnit.MILLISECONDS.toMinutes(rawOffset); minutes = Math.abs(minutes - TimeUnit.HOURS.toMinutes(hours)); return String.format("%+03d:%02d", hours, Math.abs(minutes)); }

7. Conclusion

Dans ce tutoriel rapide, nous avons vu comment nous pouvons compiler une liste de tous les fuseaux horaires disponibles avec leurs décalages UTC et GMT.

Et, comme toujours, le code source complet des exemples est disponible à l'adresse over sur GitHub.