Différence entre UTC et GMT

❌ La réponse acceptée n’est ni correcte ni utile.

✅ En revanche, la réponse d’Ole V.V. résume correctement les différences techniques – pour plus de détails, suivez les liens vers les pages détaillées de Wikipédia.

Pour les programmeurs qui construisent des applications orientées business, le résultat est que UTC est le nouveau GMT. Vous pouvez utiliser les termes de manière interchangeable, la différence étant littéralement inférieure à une seconde. Donc, à toutes fins pratiques, dans la plupart des apps, aucune différence du tout.

Voici quelques conseils plus pratiques, avec des exemples de code.

Chaînes

Disons que j’ai l’heure UTC comme « 02-01-2018 00:03 », cela signifie-t-il que mon heure locale américaine est « 01-01-2018 18:00 » ?

Cette première partie est un mauvais exemple, la chaîne date-heure étant dépourvue d’un indicateur de son décalage ou de sa zone.

Si une chaîne indique un moment précis, elle doit indiquer soit un fuseau horaire (Continent/Region nom formaté) et/ou un décalage par rapport à l’UTC sous la forme d’un nombre d’heures-minutes-secondes. Si la chaîne est censée représenter un moment à l’UTC même, cela signifie un offset-from-UTC de zéro.

Pour écrire cette chaîne avec un décalage, diverses conventions peuvent être appliquées. La meilleure en pratique est avec les heures et les minutes accompagnées d’un deux-points, comme +00:00+05:30, ou -08:00. Le zéro de tête et le deux-points sont tous deux facultatifs, mais j’ai vu des bibliothèques se casser en rencontrant une valeur telle que -0800 ou -8.

Zulu

Comme raccourci pour un décalage de zéro, la lettre Z est couramment utilisée pour désigner l’UTC lui-même. Se prononce Zulu.

ISO 8601

En outre, la meilleure pratique pour le formatage textuel de la date-heure pour l’informatique est d’utiliser les formats standards ISO 8601. Pour une date-heure, on utilise le format YYYY-MM-DDTHH:MM:SS±HH:MM:SS. Le T sépare la partie date de la partie heure du jour. Ce format présente des avantages tels que le fait d’être largement non ambigu, facile à analyser par la machine, facile à lire par les humains à travers les cultures. Un autre avantage est que le tri alphabétique est également chronologique. La norme accepte également l’abréviation Z.

Donc votre exemple UTC time as "02-01-2018 00:03" est mieux énoncé comme 2018-01-02T00:03Z.

java.time

Soyez très conscient que la plupart des langages de programmation, des bibliothèques et des bases de données ont un très mauvais support pour la gestion de la date-heure, généralement basé sur une mauvaise compréhension des problèmes de date-heure. La manipulation de la date-heure est étonnamment compliquée et délicate à maîtriser.

La seule bibliothèque décente que j’ai rencontrée est les classes java.time (voir Tutoriel) fournies avec Java 8 et les versions ultérieures, et son prédécesseur le projet Joda-Time (également vaguement porté de Java à .Net dans le projet Noda Time).

Dans java.time, un moment est représenté de trois manières. Toutes ont une résolution de nanosecondes.

  • Instant
    Toujours en UTC. Techniquement, un comptage de nanosecondes depuis la référence d’époque du premier moment de 1970 (1970-01-01T00:00:00Z).
  • OffsetDateTime
    Une date avec l’heure du jour dans le contexte d’un certain nombre d’heures-minutes-secondes en avance, ou en retard, sur UTC.
  • ZonedDateTime
    Une date avec l’heure du jour dans le contexte d’un certain fuseau horaire.

Alors, quelle est la différence entre un fuseau horaire et un décalage par rapport à l’UTC ? Pourquoi avons-nous besoin de classes distinctes ? Un décalage par rapport à l’UTC est simplement un nombre d’heures-minutes-secondes, trois chiffres, ni plus, ni moins. Un fuseau horaire est bien plus que cela. Un fuseau horaire est une histoire des changements passés, présents et futurs du décalage utilisé par les habitants d’une région particulière.

Quels changements ? Des changements dictés par les caprices ou la sagesse de leurs politiciens. Les politiciens du monde entier ont montré une prédilection pour modifier le décalage utilisé par le ou les fuseaux horaires de leur juridiction. L’heure d’été (DST) est un modèle commun de changements, avec son calendrier souvent modifié et la décision d’adopter ou de revenir à l’heure d’été parfois changée. D’autres changements se produisent également, comme juste au cours des dernières années, la Corée du Nord changeant son horloge d’une demi-heure pour se synchroniser avec la Corée du Sud, le Venezuela reculant son horloge d’une demi-heure pour ensuite faire un bond en avant moins d’une décennie plus tard, la Turquie annulant cette année le changement prévu de l’heure d’été à l’heure normale avec peu de préavis, et la Russie contemporaine ayant fait de multiples changements de ce type ces dernières années.

Retournons à votre exemple dans votre point # 3, regardons un peu de code.

Disons que j’ai l’heure UTC comme « 02-01-2018 00:03 », cela signifie-t-il que mon heure locale américaine est « 01-01-2018 18:00 » ?

Vos chaînes d’exemple présentent un autre problème. Cette 03 minute dans la première partie est ignorée votre deuxième partie, une faute de frappe apparente. Je le sais parce qu’il n’y a aucun ajustement de fuseau horaire en vigueur en Amérique à cette date impliquant une heure fractionnelle de 57 minutes.

Pas un instant

D’abord, nous analysons votre chaîne d’entrée. En l’absence de tout indicateur de zone ou de décalage, nous devons analyser à l’aide du LocalDateTime. Le nom LocalDateTime peut être trompeur, car il ne signifie pas une localité spécifique. Il signifie n’importe quelle localité ou toutes les localités. Pour plus d’explications, voir Quelle est la différence entre Instant et LocalDateTime ?

String input = "2018-01-02T00:03" ; // Text of a date with time-of-day but without any context of time zore or offset-from-UTC. *Not* a moment, *not* a point on the timeline.LocalDateTime ldt = LocalDateTime.parse( input ) ; // Parsing the input as a `LocalDateTime`, a class representing a date with time but no zone/offset. Again, this does *not* represent a moment, is *not* a point on the timeline. 

UTC

Par les faits donnés dans la Question, nous savons que cette date et cette heure étaient destinées à représenter un moment en UTC. Nous pouvons donc attribuer le contexte d’un décalage par rapport à l’UTC de zéro heure-minutes-secondes pour l’UTC lui-même. On applique une ZoneOffset constante UTC pour obtenir un objet OffsetDateTime.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ); // We are certain this text was intended to represent a moment in UTC. So correct the faulty text input by assigning the context of an offset of zero, for UTC itself.

Fuseau horaire

La Question demande de voir ce moment à travers une heure murale de six heures en retard sur l’UTC utilisé aux États-Unis. Un fuseau horaire présentant un tel décalage est America/Chicago.

Spécifiez un nom de fuseau horaire approprié au format continent/region, tel que America/MontrealAfrica/Casablanca, ou Pacific/Auckland. N’utilisez jamais l’abréviation de 2 à 4 lettres telle que CSTEST, ou IST car il ne s’agit pas de véritables fuseaux horaires, ils ne sont pas normalisés et ne sont même pas uniques( !).

ZoneId z = ZoneId.of( "America/Chicago" ) ; // Adjust from UTC to a time zone where the wall-clock time is six hours behind UTC.ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

Voir ce code exécuté en direct sur IdeOne.com.

odt.toString() : 2018-01-02T00:03Z

zdt.toString() : 2018-01-01T18:03-06:00

Même moment, heure d’horloge murale différente

Cette odt et cette zdt représentent toutes deux le même moment simultané, le même point sur la ligne de temps. La seule différence est l’heure de l’horloge murale.

Travaillons un exemple, en utilisant l’Islande où leur fuseau horaire utilise un décalage par rapport à l’UTC de zéro heure-minutes-secondes. Ainsi, la zone Atlantic/Reykjavik a une heure d’horloge murale identique à UTC. Au moins aujourd’hui, leur heure d’horloge murale correspond à UTC ; dans le passé ou le futur, elle peut être différente, c’est pourquoi il est incorrect de dire « UTC est le fuseau horaire de l’Islande ». Quoi qu’il en soit, notre exemple… Supposons qu’un habitant de Reykjavík, en Islande, dont l’horloge murale indique minuit moins trois, passe un appel téléphonique à un habitant des États-Unis. Cette personne américaine vit dans un endroit utilisant le fuseau horaire de la région de Chicago. Lorsque la personne appelée décroche son téléphone, elle jette un coup d’œil à l’horloge accrochée à son mur pour constater qu’il est juste après 18 heures (18:03). Même moment, heure différente de l’horloge murale.

De même, les calendriers accrochés à leurs murs sont différents, puisqu’il est  » demain  » en Islande mais  » hier  » sur le continent américain. Même moment, dates différentes !

Tableau des types de date-heure en Java, modernes et anciens.

A propos de java.time

Le cadre java.time est intégré à Java 8 et aux versions ultérieures. Ces classes supplantent les anciennes classes de date-heure gênantes comme java.util.DateCalendar&SimpleDateFormat.

Le projet Joda-Time, désormais en mode maintenance, conseille de migrer vers les classes java.time.

Pour en savoir plus, consultez le tutoriel Oracle. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC conforme à la norme JDBC 4.2 ou ultérieure. Pas besoin de chaînes de caractères, pas besoin de java.sql.* classes.

Où obtenir les classes java.time ?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 et versions ultérieures – Fait partie de l’API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • La plupart de la fonctionnalité java.time est rétroportée vers Java 6 & 7 dans ThreeTen-Backport.
  • Androïd
    • Les dernières versions d’Android regroupent des implémentations des classes java.time classes.
    • Pour les Android antérieurs (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP….

Tableau de quelle bibliothèque java.time utiliser avec quelle version de Java ou Android

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que IntervalYearWeekYearQuarter, et bien d’autres.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *