J'espère faire de cette question et de ses réponses le guide définitif pour faire face à l'heure d'été, en particulier pour faire face aux changements réels.
Si vous avez quelque chose à ajouter, veuillez
De nombreux systèmes dépendent de l'heure exacte, le problème vient des changements d'heure dus à l'heure d'été - le déplacement de l'horloge vers l'avant ou vers l'arrière.
Par exemple, on a des règles commerciales dans un système de prise de commande qui dépendent de l'heure de la commande - si l'horloge change, les règles pourraient ne pas être aussi claires. Comment le moment de la commande doit-il être conservé? Il existe bien sûr un nombre infini de scénarios - celui-ci est simplement illustratif.
- Comment avez-vous résolu le problème de l'heure d'été?
- Quelles hypothèses font partie de votre solution? (recherche de contexte ici)
Aussi important, sinon plus:
- Qu'avez-vous essayé qui n'a pas fonctionné?
- Pourquoi ça n'a pas marché?
Je serais intéressé par la programmation, le système d'exploitation, la persistance des données et d'autres aspects pertinents du problème.
Les réponses générales sont excellentes, mais j'aimerais également voir des détails, surtout s'ils ne sont disponibles que sur une seule plate-forme.
GETDATE()
sur SQL sera UTC (comme le seraDateTime.Now
). Et le serveur ne sera affecté par aucune sorte de modifications DST automatiques.DateTime.UtcNow
etGETUTCDATE()
cela montre également aux autres développeurs que vous y avez réellement penséRéponses:
Résumé des réponses et autres données: (veuillez ajouter les vôtres)
Faire:
datetimeoffset
type qui peut stocker les deux dans un seul champ.1970-01-01T00:00:00Z
(à l'exclusion des secondes intercalaires). Si vous avez besoin d'une précision plus élevée, utilisez plutôt des millisecondes. Cette valeur doit toujours être basée sur UTC, sans aucun ajustement de fuseau horaire.DateTimeOffset
c'est souvent un meilleur choix queDateTime
.DateTime
et lesDateTimeZone
classes. Soyez prudent lors de l'utilisationDateTimeZone::listAbbreviations()
- voir la réponse . Pour garder PHP avec des données Olson à jour, installez périodiquement le paquet PECL timezonedb ; voir réponse .>=
,<
).Ne pas:
America/New_York
avec un "décalage de fuseau horaire", comme-05:00
. Ce sont deux choses différentes. Voir le wiki des balises de fuseau horaire .Date
objet JavaScript pour effectuer des calculs de date et d'heure dans des navigateurs Web plus anciens, car ECMAScript 5.1 et inférieur a un défaut de conception qui peut utiliser incorrectement l'heure d'été. (Cela a été corrigé dans ECMAScript 6/2015).Essai:
Référence:
timezone
page wiki du tag détaillé sur Stack Overflowdst
timezone
Autre:
la source
Je ne sais pas ce que je peux ajouter aux réponses ci-dessus, mais voici quelques points de ma part:
Types de fois
Vous devez considérer quatre moments différents:
Il y a aussi une heure historique / alternative. Ce sont ennuyeux car ils peuvent ne pas correspondre à l'heure standard. Par exemple: dates juliennes, dates selon un calendrier lunaire sur Saturne, le calendrier Klingon.
Le stockage des horodatages de début / fin en UTC fonctionne bien. Pour 1, vous avez besoin d'un nom de fuseau horaire d'événement + décalage stocké avec l'événement. Pour 2, vous avez besoin d'un identifiant d'heure locale stocké avec chaque région et d'un nom de fuseau horaire local + décalage stocké pour chaque téléspectateur (il est possible de le dériver de l'IP si vous êtes en crise). Pour 3, stockez en secondes UTC et pas besoin de fuseaux horaires. 4 est un cas spécial de 1 ou 2 selon qu'il s'agit d'un événement global ou local, mais vous devez également stocker un élément créé à l' horodatage afin de savoir si une définition de fuseau horaire a changé avant ou après la création de cet événement. Cela est nécessaire si vous devez afficher des données historiques.
Temps de stockage
Décalages et noms
Un exemple de ce qui précède serait:
Avec ces informations, nous pouvons historiquement déterminer l'heure exacte à laquelle la finale du WCS 2010 a eu lieu, même si la définition du fuseau horaire sud-africain change, et être en mesure d'afficher cela aux téléspectateurs dans leur fuseau horaire local au moment où ils interrogent la base de données.
Le temps du système
Vous devez également synchroniser votre système d'exploitation, votre base de données et vos fichiers tzdata d'application, à la fois entre eux et avec le reste du monde, et effectuer des tests approfondis lors de la mise à niveau. Il n'est pas rare qu'une application tierce sur laquelle vous dépendez n'ait pas correctement géré une modification TZ.
Assurez-vous que les horloges matérielles sont définies sur UTC et si vous exécutez des serveurs dans le monde entier, assurez-vous que leurs systèmes d'exploitation sont également configurés pour utiliser UTC. Cela devient évident lorsque vous devez copier des fichiers journaux Apache pivotés toutes les heures à partir de serveurs dans plusieurs fuseaux horaires. Les trier par nom de fichier ne fonctionne que si tous les fichiers sont nommés avec le même fuseau horaire. Cela signifie également que vous n'avez pas à faire de calcul de date dans votre tête lorsque vous passez d'une boîte à l'autre et que vous devez comparer les horodatages.
Exécutez également ntpd sur toutes les boîtes.
Clients
Ne faites jamais confiance à l'horodatage que vous obtenez d'un ordinateur client comme valide. Par exemple, les en-têtes Date: HTTP ou un
Date.getTime()
appel javascript . Ceux-ci sont parfaits lorsqu'ils sont utilisés comme identifiants opaques ou lorsque vous effectuez des calculs de date au cours d'une seule session sur le même client, mais n'essayez pas de comparer ces valeurs avec quelque chose que vous avez sur le serveur. Vos clients n'exécutent pas NTP et ne disposent pas nécessairement d'une batterie de travail pour leur horloge BIOS.Trivia
Enfin, les gouvernements feront parfois des choses très étranges:
Ok, je pense que j'ai fini.
la source
DateTimeOffset
(ou équivalent) sont utiles. Sinon, bonne rédaction.C'est une question importante et étonnamment difficile. La vérité est qu'il n'y a pas de norme complètement satisfaisante pour la persistance du temps. Par exemple, la norme SQL et le format ISO (ISO 8601) ne sont clairement pas suffisants.
Du point de vue conceptuel, on traite généralement de deux types de données de date et d'heure, et il est commode de les distinguer (les normes ci-dessus ne le font pas): " heure physique " et " heure civile ".
Un instant "physique" du temps est un point de la chronologie universelle continue avec lequel la physique traite (en ignorant la relativité, bien sûr). Ce concept peut être adéquatement codé en UTC, par exemple (si vous pouvez ignorer les secondes intercalaires).
Un temps "civil" est une spécification datetime qui suit les normes civiles: un point de temps ici est entièrement spécifié par un ensemble de champs datetime (Y, M, D, H, MM, S, FS) plus un TZ (spécification de fuseau horaire) (également un "calendrier", en fait; mais supposons que nous limitons la discussion au calendrier grégorien). Un fuseau horaire et un calendrier permettent conjointement (en principe) de mapper d'une représentation à l'autre. Mais les instants temporels civils et physiques sont des types de magnitudes fondamentalement différents, et ils devraient être séparés conceptuellement et traités différemment (une analogie: des tableaux d'octets et des 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 l'époque civile est sujette à des changements politiques. Le problème (et la nécessité de distinguer ces concepts) devient plus évident pour les événements futurs. Exemple (tiré de ma discussion ici .
John enregistre dans son calendrier un rappel pour un événement à l'heure
2019-Jul-27, 10:30:00
, TZ =Chile/Santiago
, (qui a décalé GMT-4, donc cela correspond à UTC2019-Jul-27 14:30:00
). Mais un jour à l'avenir, le pays décide de changer la compensation TZ en GMT-5.Maintenant, quand le jour viendra ... si ce rappel se déclenche à
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 bonne réponse, à moins que l'on ne sache ce que Jean voulait dire conceptuellement quand il a dit au calendrier "Veuillez me téléphoner à
2019-Jul-27, 10:30:00 TZ=Chile/Santiago
".Voulait-il dire un «rendez-vous civil» («quand les horloges de ma ville indiquent 10 h 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, disons, "quand la prochaine éclipse solaire se produira". Dans ce cas, la réponse B) est la bonne.
Quelques API Date / Heure obtiennent cette distinction: parmi elles, Jodatime , qui est le fondement de la prochaine (troisième!) API Java DateTime (JSR 310).
la source
Faites une séparation architecturale claire des préoccupations - pour savoir exactement quel niveau interagit avec les utilisateurs, et doit changer la date-heure pour / de la représentation canonique (UTC). La date-heure non UTC est la présentation (suit le fuseau horaire local des utilisateurs), l' heure UTC est le modèle (reste unique pour les niveaux principaux et intermédiaires).
Décidez également quel est votre public réel, ce que vous n'avez pas à servir et où tracez-vous la ligne . Ne touchez pas aux calendriers exotiques à moins que vous ayez réellement des clients importants là-bas, puis envisagez des serveurs distincts pour l'utilisateur uniquement pour cette région.
Si vous pouvez acquérir et conserver l'emplacement de l'utilisateur, utilisez l'emplacement pour la conversion systématique date-heure (par exemple, la culture .NET ou une table SQL) mais fournissez un moyen pour l'utilisateur final de choisir des remplacements si la date-heure est critique pour vos utilisateurs.
S'il y a des obligations d'audit historiques impliquées (comme dire exactement quand Jo en AZ a payé une facture il y a 2 ans en septembre), gardez à la fois l'heure UTC et locale pour l'enregistrement (vos tables de conversion changeront au fil du temps).
Définissez le fuseau horaire de référence pour les données qui arrivent en vrac - comme les fichiers, les services Web, etc. Supposons que la société East Coast possède un centre de données en Californie - vous devez demander et savoir ce qu'elle utilise comme standard au lieu de supposer l'un ou l'autre.
Ne vous fiez pas aux décalages de fuseau horaire intégrés dans la représentation textuelle de la date-heure et n'acceptez pas de les analyser et de les suivre. Au lieu de cela, demandez toujours que le fuseau horaire et / ou le fuseau de référence soient définis explicitement . Vous pouvez facilement recevoir l'heure avec décalage PST, mais l'heure est en fait EST, car il s'agit de l'heure de référence du client et les enregistrements ont juste été exportés vers un serveur qui est en PST.
la source
Vous devez connaître la base de données Olson tz , qui est disponible sur
ftp://elsie.nci.nih.gov/pubhttp://iana.org/time-zones/ . Il est mis à jour plusieurs fois par an pour tenir compte des changements souvent de dernière minute concernant le moment (et l'opportunité) de basculer entre l'heure d'hiver et d'été (heure d'été et heure d'été) dans différents pays du monde. En 2009, la dernière version était des années 2009; en 2010, c'était 2010n; en 2011, c'était 2011n; fin mai 2012, la sortie était 2012c. Notez qu'il existe un ensemble de codes pour gérer les données et les données de fuseau horaire elles-mêmes, dans deux archives distinctes (tzcode20xxy.tar.gz et tzdata20xxy.tar.gz). Le code et les données sont dans le domaine public.Il s'agit de la source des noms de fuseau horaire tels que America / Los_Angeles (et des synonymes tels que US / Pacific).
Si vous devez suivre les différentes zones, vous avez besoin de la base de données Olson. Comme d'autres l'ont conseillé, vous souhaitez également stocker les données dans un format fixe - UTC est normalement celui choisi - avec un enregistrement du fuseau horaire dans lequel les données ont été générées. Vous souhaiterez peut-être faire la distinction entre le décalage par rapport à l'UTC à l'heure et le nom du fuseau horaire; cela peut faire une différence plus tard. En outre, sachant qu'il s'agit actuellement du 2010-03-28T23: 47: 00-07: 00 (États-Unis / Pacifique) peut ou non vous aider à interpréter la valeur 2010-11-15T12: 30 - qui est probablement spécifiée dans PST ( Pacific Standard Time) plutôt que PDT (Pacific Daylight Saving Time).
Les interfaces de bibliothèque C standard ne sont pas terriblement utiles avec ce genre de choses.
Les données Olson ont changé, en partie parce que AD Olson va bientôt prendre sa retraite, et en partie parce qu'il y a eu une action en justice (maintenant rejetée) contre les responsables pour violation du droit d'auteur. La base de données de fuseau horaire est désormais gérée sous les auspices de l' IANA , Internet Assigned Numbers Authority, et il y a un lien sur la première page vers «Time Zone Database» . La liste de diffusion de discussion est maintenant
[email protected]
; la liste des annonces est[email protected]
.la source
zic.8
page de manuel (ouzic.8.txt
). Vous aurez besoin dutzcode2011i.tar.gz
fichier plutôt que, ou aussi, dutzdata2011i.tar.gz
fichier pour obtenir ces informations.En général, incluez le décalage horaire local (y compris le décalage DST) dans les horodatages stockés: UTC seul ne suffit pas si vous souhaitez afficher ultérieurement l'horodatage dans son fuseau horaire d'origine (et le réglage DST).
Gardez à l'esprit que le décalage n'est pas toujours un nombre entier d'heures (par exemple, l'heure standard indienne est UTC + 05: 30).
Par exemple, les formats appropriés sont un tuple (temps Unix, décalage en minutes) ou ISO 8601 .
la source
Traverser la frontière du «temps informatique» et du «temps des gens» est un cauchemar. Le principal étant qu'il n'existe aucune sorte de norme pour les règles régissant les fuseaux horaires et les heures d'été. Les pays sont libres de modifier leur fuseau horaire et leurs règles d'heure d'été à tout moment, et ils le font.
Certains pays, comme Israël et le Brésil, décident chaque année de l'heure d'été, il est donc impossible de savoir à l'avance quand (si) l'heure d'été sera en vigueur. D'autres ont des règles fixes (ish) sur le moment où l'heure d'été est en vigueur. D'autres pays n'utilisent pas tous l'heure d'été.
Les fuseaux horaires ne doivent pas être des différences d'une heure complète par rapport à l'heure GMT. Le Népal est +5,45. Il y a même des fuseaux horaires qui sont +13. Cela veut dire que:
sont tous en même temps, et pourtant 3 jours différents!
Il n'y a pas non plus de norme claire sur les abréviations des fuseaux horaires et sur la façon dont ils changent lorsqu'ils sont en DST, vous vous retrouvez avec des choses comme ceci:
Le meilleur conseil est de vous éloigner autant que possible des heures locales et de vous en tenir à UTC où vous le pouvez. Convertissez uniquement en heure locale au dernier moment possible.
Lors des tests, assurez-vous de tester les pays des hémisphères occidentaux et orientaux, avec à la fois l'heure d'été en cours et non et un pays qui n'utilise pas l'heure d'été (6 au total).
la source
Pour PHP:
La classe DateTimeZone en PHP> 5.2 est déjà basée sur la base de données Olson que d'autres mentionnent, donc si vous effectuez des conversions de fuseau horaire en PHP et non dans la base de données, vous êtes exempté de travailler avec les fichiers Olson (difficiles à comprendre).
Cependant, PHP n'est pas mis à jour aussi souvent que la base de données Olson, donc l'utilisation de conversions de fuseau horaire PHP peut vous laisser des informations DST obsolètes et influencer l'exactitude de vos données. Bien que cela ne devrait pas se produire fréquemment, cela peut se produire et se produira si vous avez une large base d'utilisateurs dans le monde.
Pour faire face au problème ci-dessus, utilisez le package timezonedb pecl . Sa fonction est de mettre à jour les données de fuseau horaire de PHP. Installez ce package aussi souvent qu'il est mis à jour. (Je ne sais pas si les mises à jour de ce package suivent exactement les mises à jour Olson, mais il semble être mis à jour à une fréquence qui est au moins très proche de la fréquence des mises à jour Olson.)
la source
Si votre conception peut l'adapter, évitez la conversion de l'heure locale tous ensemble!
Je sais que pour certains cela peut sembler fou, mais pensez à UX: les utilisateurs traitent des dates proches (aujourd'hui, hier, lundi prochain) plus rapidement que les dates absolues (2010.09.17, vendredi 17 septembre) en un coup d'œil. Et quand on y pense plus, la précision des fuseaux horaires (et DST) est plus importante plus la date est proche
now()
, donc si vous pouvez exprimer des dates / heures dans un format relatif pendant +/- 1 ou 2 semaines, le reste de les dates peuvent être UTC et cela n'aura pas trop d'importance pour 95% des utilisateurs.De cette façon, vous pouvez stocker toutes les dates en UTC et faire les comparaisons relatives en UTC et simplement afficher les dates UTC de l'utilisateur en dehors de votre seuil de date relatif.
Cela peut également s'appliquer à la saisie utilisateur (mais généralement de manière plus limitée). La sélection dans une liste déroulante qui n'a que {Hier, aujourd'hui, demain, lundi prochain, jeudi prochain} est tellement plus simple et plus facile pour l'utilisateur qu'un sélecteur de date. Les sélecteurs de dates sont parmi les composants les plus douloureux du remplissage de formulaires. Bien sûr, cela ne fonctionnera pas dans tous les cas, mais vous pouvez voir qu'il suffit d'un peu de conception intelligente pour le rendre très puissant.
la source
Bien que je ne l'ai pas essayé, une approche des ajustements de fuseau horaire que je trouverais convaincante serait la suivante:
Stockez tout en UTC.
Créez une table
TZOffsets
avec trois colonnes: RegionClassId, StartDateTime et OffsetMinutes (int, en minutes).Dans le tableau, stocker une liste des dates et des heures où l'heure locale changé, et combien. Le nombre de régions dans le tableau et le nombre de dates dépendent de la plage de dates et des régions du monde que vous devez prendre en charge. Considérez cela comme s'il s'agissait d'une date "historique", même si les dates devraient inclure l'avenir dans une certaine limite pratique.
Lorsque vous devez calculer l'heure locale de n'importe quelle heure UTC, procédez comme suit:
Vous souhaiterez peut-être mettre en cache cette table dans votre application et utiliser LINQ ou un moyen similaire pour effectuer les requêtes plutôt que de frapper la base de données.
Ces données peuvent être distillées à partir de la base de données tz du domaine public .
Avantages et notes de bas de page de cette approche:
Maintenant, le seul inconvénient de cette approche ou de toute autre est que les conversions de l'heure locale en GMT ne sont pas parfaites, car tout changement d'heure d'été qui a un décalage négatif par rapport à l'horloge répète une heure locale donnée. Ce n'est pas un moyen facile de gérer cela, je le crains, ce qui est une des raisons pour lesquelles l'heure locale est une mauvaise nouvelle en premier lieu.
la source
J'ai récemment rencontré un problème dans une application Web où, sur un post-back Ajax, le datetime revenant à mon code côté serveur était différent du datetime servi.
Cela avait très probablement à voir avec mon code JavaScript sur le client qui a créé la date de publication sur le client sous forme de chaîne, car JavaScript ajustait le fuseau horaire et l'heure d'été, et dans certains navigateurs, le calcul du moment où appliquer l'heure d'été semblait différent des autres.
À la fin, j'ai choisi de supprimer entièrement les calculs de date et d'heure sur le client, et j'ai posté sur mon serveur une clé entière qui a ensuite été traduite à l'heure actuelle sur le serveur, pour permettre des transformations cohérentes.
Mon apprentissage: n'utilisez pas les calculs de date et d'heure JavaScript dans les applications Web, sauf si vous en avez ABSOLUMENT besoin.
la source
J'ai touché ceci sur deux types de systèmes, «les systèmes de planification des équipes (par exemple les ouvriers d'usine)» et les «systèmes de gestion dépendant du gaz)
Les journées de 23 et 25 heures sont difficiles à gérer, tout comme les quarts de 8 heures qui prennent 7 heures ou 9 heures. Le problème est que vous constaterez que chaque client, ou même département du client, a des règles différentes qu'il a créées (souvent sans documenter) sur ce qu'il fait dans ces cas particuliers.
Il est préférable de ne pas poser certaines questions au client avant qu'il n'ait payé pour votre logiciel «standard». Il est très rare de trouver un client qui pense à ce type de problème dès le départ lors de l'achat d'un logiciel.
Je pense que dans tous les cas, vous devez enregistrer l'heure en UTC et convertir en / à partir de l'heure locale avant de stocker la date / l'heure. Cependant, même savoir quelle prise de temps donnée peut être difficile avec l'heure d'été et les fuseaux horaires.
la source
Pour le web, les règles ne sont pas si compliquées ...
Le reste est juste une conversion UTC / locale en utilisant vos bibliothèques datetime côté serveur. Bon pour aller ...
la source
Lorsqu'il s'agit d'applications qui s'exécutent sur un serveur , y compris des sites Web et d'autres services principaux, le paramètre de fuseau horaire du serveur doit être ignoré par l'application.
Il est généralement conseillé de définir le fuseau horaire du serveur sur UTC. C'est en effet une bonne pratique exemplaire, mais c'est là comme un pansement pour les applications qui ne suivent pas d'autres bonnes pratiques. Par exemple, un service peut écrire dans des fichiers journaux avec des horodatages locaux au lieu d'horodatages basés sur UTC, créant ainsi des ambiguïtés lors de la transition de repli de l'heure d'été. La définition du fuseau horaire du serveur sur UTC corrigera cette application. Cependant, la vraie solution serait que l'application se connecte en utilisant UTC pour commencer.
Le code côté serveur, y compris les sites Web, ne doit jamais s'attendre à ce que le fuseau horaire local du serveur soit particulier.
Dans certaines langues, le fuseau horaire local peut facilement se glisser dans le code d'application. Par exemple, la
DateTime.ToUniversalTime
méthode dans .NET convertira du fuseau horaire local en UTC et laDateTime.Now
propriété renvoie l'heure actuelle dans le fuseau horaire local. En outre, leDate
constructeur en JavaScript utilise le fuseau horaire local de l'ordinateur. Il existe de nombreux autres exemples comme celui-ci. Il est important de pratiquer la programmation défensive, en évitant tout code utilisant le paramètre de fuseau horaire local de l'ordinateur.Réservez en utilisant le fuseau horaire local pour le code côté client, comme les applications de bureau, les applications mobiles et le JavaScript côté client.
la source
Gardez vos serveurs définis sur UTC et assurez-vous qu'ils sont tous configurés pour ntp ou l'équivalent.
L'UTC évite les problèmes d'heure d'été et les serveurs désynchronisés peuvent entraîner des résultats imprévisibles qui prennent un certain temps à diagnostiquer.
la source
Soyez prudent lorsque vous traitez avec des horodatages stockés dans le système de fichiers FAT32 - il est toujours conservé dans les coordonnées de l'heure locale (qui incluent l'heure d'été - voir l' article msdn ). Vous avez brûlé sur celui-là.
la source
Une autre chose, assurez-vous que les correctifs d'heure d'été mis à jour sont appliqués aux serveurs.
L'année dernière, nous avons eu une situation où nos temps étaient systématiquement dépassés d'une heure pendant une période de trois semaines pour les utilisateurs nord-américains, même si nous utilisions un système basé sur UTC.
Il s'avère finalement que ce sont les serveurs. Ils avaient juste besoin d'un correctif à jour appliqué ( Windows Server 2003 ).
la source
DateTimeZone::listAbbreviations()
Sortie de PHPCette méthode PHP renvoie un tableau associatif contenant des fuseaux horaires «majeurs» (comme CEST), qui en eux-mêmes contiennent des fuseaux horaires «géographiques» plus spécifiques (comme Europe / Amsterdam).
Si vous utilisez ces fuseaux horaires et leurs informations de décalage / DST, il est extrêmement important de réaliser ce qui suit:
Il semble que toutes les différentes configurations offset / DST (y compris les configurations historiques) de chaque fuseau horaire sont incluses!
Par exemple, Europe / Amsterdam peut être trouvé six fois dans la sortie de cette fonction. Deux occurrences (offset 1172/4772) sont pour le temps d'Amsterdam utilisé jusqu'en 1937; deux (1200/4800) sont pour l'époque qui a été utilisée entre 1937 et 1940; et deux (3600/4800) correspondent au temps utilisé depuis 1940.
Par conséquent, vous ne pouvez pas compter sur les informations de décalage / DST renvoyées par cette fonction comme étant actuellement correctes / utilisées!
Si vous voulez connaître le décalage / DST actuel d'un certain fuseau horaire, vous devrez faire quelque chose comme ceci:
la source
S'il vous arrive de maintenir des systèmes de base de données qui fonctionnent avec l'heure d'été active, vérifiez soigneusement s'ils doivent être arrêtés pendant la transition à l'automne. Mandy DBS (ou d'autres systèmes également) n'aime pas passer deux fois le même point dans l'heure (locale), ce qui se produit exactement lorsque vous revenez en arrière à l'automne. SAP a résolu cela avec une solution de contournement (à mon humble avis) - au lieu de revenir en arrière, ils ont juste laissé l'horloge interne fonctionner à la moitié de la vitesse habituelle pendant deux heures ...
la source
Utilisez-vous le framework .NET ? Si c'est le cas, permettez-moi de vous présenter le type DateTimeOffset , ajouté avec .NET 3.5.
Cette structure contient à la fois un
DateTime
et un décalage (TimeSpan
), qui spécifie la différence entre laDateTimeOffset
date et l'heure de l' instance et le temps universel coordonné (UTC).La
DateTimeOffset.Now
méthode statique renvoie uneDateTimeOffset
instance composée de l'heure (locale) actuelle et du décalage local (comme défini dans les informations régionales du système d'exploitation).La
DateTimeOffset.UtcNow
méthode statique renvoie uneDateTimeOffset
instance composée de l'heure actuelle en UTC (comme si vous étiez à Greenwich).Les autres types utiles sont les classes TimeZone et TimeZoneInfo .
la source
Pour ceux qui ont du mal avec cela sur .NET , voyez si l'utilisation
DateTimeOffset
et / ou enTimeZoneInfo
vaut la peine.Si vous souhaitez utiliser les fuseaux horaires IANA / Olson ou si les types intégrés sont insuffisants pour vos besoins, consultez Noda Time , qui propose une API de date et d'heure beaucoup plus intelligente pour .NET.
la source
Les règles commerciales devraient toujours fonctionner sur le temps civil (sauf si une législation stipule le contraire). Soyez conscient que le temps civil est un gâchis, mais c'est ce que les gens utilisent donc c'est ce qui est important.
En interne, conservez les horodatages dans quelque chose comme civil-time-seconds-from-epoch. L' époque n'a pas d'importance particulière (je préfère l' époque Unix ) mais cela rend les choses plus faciles que l'alternative. Imaginez que les secondes intercalaires n'existent que si vous faites quelque chose qui en a vraiment besoin (par exemple, le suivi par satellite). Le mappage entre les horodatages et l'heure affichée est le seul point où les règles DST doivent être appliquées; les règles changent fréquemment (au niveau mondial, plusieurs fois par an; blâmer les politiciens), vous devez donc vous assurer de ne pas coder en dur la cartographie. La base de données TZ d'Olson est inestimable.
la source
Je voulais juste souligner deux choses qui semblent inexactes ou du moins déroutantes:
Pour (presque) toutes les applications informatiques pratiques, l'UTC est en fait GMT. À moins que vous ne voyiez un horodatage avec une fraction de seconde, vous avez affaire à GMT, ce qui rend cette distinction redondante.
Un horodatage est toujours représenté en GMT et n'a donc pas de décalage.
la source
Voici mon expérience: -
(Ne nécessite aucune bibliothèque tierce)
la source
getTimezoneOffset
renvoie le décalage pour la date et l'heure auxquelles vous l'appelez. Ce décalage peut changer lorsqu'un fuseau horaire passe dans ou hors de l'heure d'été. Voir "fuseau horaire! = Offset" dans le wiki des balises de fuseau horaire .La vidéo de Tom Scott sur les fuseaux horaires sur YouTube sur la chaîne Computerphile a également une description agréable et divertissante du sujet. Les exemples comprennent:
la source
En fait, kernel32.dll n'exporte pas SystemTimeToTzSpecificLocation. Il exporte cependant les deux suivants: SystemTimeToTzSpecificLocalTime et TzSpecificLocalTimeToSystemTime ...
la source
Ne vous fiez jamais uniquement à des constructeurs comme
Ils peuvent lever des exceptions lorsqu'une certaine date-heure n'existe pas en raison de l'heure d'été. Au lieu de cela, créez vos propres méthodes pour créer de telles dates. Dans eux, interceptez toutes les exceptions qui se produisent en raison de l'heure d'été et ajustez le temps nécessaire avec le décalage de transition. L'heure d'été peut se produire à différentes dates et à différentes heures (même à minuit pour le Brésil) selon le fuseau horaire.
la source
Un seul exemple pour prouver que le temps de traitement est le gros gâchis décrit et que vous ne pouvez jamais être complaisant. À plusieurs endroits sur cette page, les secondes intercalaires ont été ignorées.
Il y a plusieurs années, le système d'exploitation Android utilisait des satellites GPS pour obtenir une référence temporelle UTC, mais ignorait le fait que les satellites GPS n'utilisaient pas de secondes intercalaires. Personne n'a remarqué jusqu'à ce qu'il y ait de la confusion le soir du Nouvel An, lorsque les utilisateurs de téléphones Apple et les utilisateurs de téléphones Android ont fait leur compte à rebours à environ 15 secondes d'intervalle.
Je pense que cela a depuis été corrigé, mais vous ne savez jamais quand ces «petits détails» reviendront vous hanter.
la source
struct tm
en C.¹¹ Certaines implémentations de
struct tm
stockent le décalage UTC, mais cela n'a pas été intégré dans la norme.la source
En traitant des bases de données (en particulier MySQL , mais cela s'applique à la plupart des bases de données), j'ai eu du mal à stocker UTC.
J'ai trouvé plus facile de simplement stocker le datetime du serveur dans la base de données, puis de laisser la base de données reconvertir le datetime stocké en UTC (c'est-à-dire UNIX_TIMESTAMP ()) dans les instructions SQL. Après cela, vous pouvez utiliser le datetime comme UTC dans votre code.
Si vous contrôlez à 100% le serveur et tout le code, il est probablement préférable de changer le fuseau horaire du serveur en UTC.
la source