Il s'agit d'une question importante et étonnamment difficile. La vérité est qu'il n'existe pas de norme totalement satisfaisante pour la persistance du temps. Par exemple, la norme SQL et le format ISO (ISO 8601) ne sont clairement pas suffisants.
D'un point de vue conceptuel, on a généralement affaire à deux types de données temps-date, et il est pratique de les distinguer (les normes ci-dessus ne le font pas) : " temps physique " et " temps civil ".
Un instant de temps "physique" est un point de la ligne de temps universelle continue que la physique traite (en ignorant la relativité, bien sûr). Ce concept peut être codé de manière adéquate en UTC, par exemple (si vous pouvez ignorer les secondes intercalaires).
Une heure "civile" est une spécification de date-heure qui suit les normes civiles : un point de temps est ici entièrement spécifié par un ensemble de champs de date-heure (Y,M,D,H,MM,S,FS) plus un TZ (spécification de fuseau horaire) (également un "calendrier", en fait ; mais supposons que nous restreignons la discussion au calendrier grégorien). Un fuseau horaire et un calendrier permettent conjointement (en principe) de passer d'une représentation à une autre. Mais les instants de temps civil et physique sont des types de grandeurs fondamentalement différents, et ils doivent être maintenus conceptuellement séparés et traités différemment (une analogie : tableaux d'octets et chaînes de caractères).
La question est confuse parce que nous parlons de ces types d'événements de manière interchangeable, et parce que les temps civils sont sujets à des changements politiques. Le problème (et la nécessité de distinguer ces concepts) devient plus évident pour les événements à venir. Exemple (tiré de ma discussion ici .
Jean enregistre dans son calendrier un rappel pour un événement à une date donnée. 2019-Jul-27, 10:30:00
, TZ= Chile/Santiago
(qui a le décalage GMT-4, il correspond donc à UTC 2019-Jul-27 14:30:00
). Mais un jour dans le futur, le pays décide de changer le décalage TZ en GMT-5.
Maintenant, quand le jour arrive... est-ce que ce rappel doit se déclencher à...
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
ou
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
Il n'y a pas de réponse correcte, sauf si l'on sait ce que Jean voulait dire conceptuellement quand il a dit au calendrier "S'il vous plaît, appelez-moi au 2019-Jul-27, 10:30:00 TZ=Chile/Santiago
".
Voulait-il dire une "date-heure civile" ("quand les horloges de ma ville indiquent 10:30") ? Dans ce cas, A) est la bonne réponse.
Ou voulait-il dire un "instant physique du temps", un point dans la ligne continue du temps de notre univers. continue de notre univers, disons, "quand la prochaine éclipse solaire se produira". Dans ce cas, la réponse B) est la bonne.
Quelques API de date et d'heure font bien cette distinction, notamment, Jodatime qui constitue la base de la prochaine (troisième !) API Java DateTime (JSR 310).
2 votes
@abatishchev - Par ici
GETDATE()
sur SQL sera UTC (tout commeDateTime.Now
). Et le serveur ne sera pas affecté par les changements automatiques d'heure d'été.4 votes
@Oded : Je suis d'accord si "sur le serveur" sera ajouté. Mais cela peut quand même affecter d'autres applications qui ont besoin de l'heure locale. Pour cette raison et d'autres, je pense qu'il est préférable de demander l'heure Utc explicitement.
7 votes
L'UTC est préféré à l'heure GMT, à la fois parce qu'il est défini de manière plus précise et parce que les définitions de l'heure GMT sont erronées sur certains systèmes d'exploitation. Il est fréquent que les gens considèrent les termes "GMT" et "UTC" comme interchangeables, mais ils ne le sont pas entièrement. Pour presque tous les logiciels / systèmes, utilisez l'UTC. Voir stackoverflow.com/questions/2292334/
7 votes
@JoshStodola -- Jon Skeet's réponse '.
0 votes
@KennyEvitt - NodaTime est un portage de la bibliothèque Java "JodaTime", bien que je sache que vous plaisantiez à propos de la réponse de Skeet.
1 votes
@Oded vous ne pouvez pas supposer que le serveur sera en UTC, j'ai vu des serveurs de production où le fuseau horaire était "UTC" mais où l'heure d'été était appliquée, donc en réalité UTC+1 pendant plus de la moitié de l'année. D'accord avec @abatishchev pour être explicite et utiliser
DateTime.UtcNow
etGETUTCDATE()
cela montre aussi aux autres développeurs que vous y avez pensé.0 votes
Il existe plusieurs identifiants de fuseaux horaires qui font double emploi, comme "US Eastern Standard Time" ou "Eastern Standard Time". Pour en savoir plus, lisez ce qui suit : stackoverflow.com/a/15448800/37055.
0 votes
En fait, GMT et UTC ne sont pas tout à fait équivalents. En effet, GMT est défini en fonction de la rotation de la terre, et la vitesse de cette rotation varie de manière imprévisible. Il est décidé quand il faut insérer des secondes intercalaires dans l'UTC pour le faire correspondre au jour solaire (sur lequel l'UTC est basé), de sorte qu'à tout moment, les deux sont identiques à 0,9 seconde près.