Savez-vous si une API existe pour cette vérification?Routine pour vérifier si une date donnée est l'heure d'été ou d'hiver
Répondre
GetTimeZoneInformation est ce dont vous avez besoin.
Vous pouvez l'appeler et inspecter la valeur renvoyée pour détecter si l'heure d'été est activée au moment de l'appel. Il remplit également une structure qui contient des règles pour passer à l'heure d'été et à l'heure d'été. Ayant cette structure remplie et n'importe quel temps au format UTC, vous pouvez calculer relativement facilement si cette heure correspond à l'heure d'été ou à l'heure standard.
Tout va bien, mais GetTimeZoneInformation et GetDynamicTimeZoneInformation renvoient uniquement les paramètres de fuseau horaire actuels. Que se passe-t-il si le TZ actuel (c'est-à-dire, où vit mon serveur) n'est pas le TZ que je veux vérifier?
Disons que j'ai une application serveur qui réserve des livres à la caisse. Vous pouvez dire "Je veux vérifier maintenant" ou "Je vais devoir le vérifier au datetime dans le futur". Les heures de paiement sont saisies dans l'heure locale de l'utilisateur et converties en UTC avant le stockage. Lorsque l'utilisateur récupère sa liste de caisses, les heures sont converties en leur local pour l'affichage. Supposons que le serveur réside à New York et fonctionne selon les règles de l'heure d'été standard post-2007 pour les États-Unis. Le fuseau horaire est défini sur Est des États-Unis, et il est actuellement 7/27/2009 15:30, donc DST est activé.
Les utilisateurs à New York entrer les dates et les heures locales. Convertir de ET à UTC - pas un problème. Ils entrent dans une date future - bien. J'utilise l'un des deux appels API ci-dessus et le comprendre.
Toutefois, un utilisateur à Sydney souhaite réserver une sortie. Elle demande une caisse le 12/13/2009 18:25 par rapport à son fuseau horaire local à Sydney. Je ne peux pas utiliser mes infos TZ locales - Sydney et NY ne suivent pas les mêmes règles DST. Comment puis-je charger les informations TZ actuelles de Sydney et savoir si une date arbitraire est DST ou non?
Il existe des méthodes plus récentes (mais encore incomplètes) disponibles sur MS-Windows pour Win7 et Server2008/R2. Voir KB 2731771. Voir aussi ICU et Boost :: locale. Les routines Windows (GetTimeZoneInformationForYear) nécessitent que vous ayez converti votre temps UTC pour obtenir l'année au minimum. Heureusement, aucun fuseau horaire ne se déplace vers le 1er janvier dont je suis au courant. Vous pouvez utiliser SystemTimeToTzSpecificLocalTime (Ex) pour convertir correctement l'heure locale en fuseau horaire différent du fuseau horaire du système local. Sans ces méthodes, vous devez analyser le registre pour charger les informations de fuseau horaire et les informations dynamiques appropriées, puis appeler SystemTimeToTecSpecificLocalTime. Faites attention en utilisant des choses comme _tzset et localtime car certains systèmes (comme Windows) supposent beaucoup de choses (la plupart du temps incorrectes) comme l'utilisation des règles US DST même si vos réglages TZ sont pour l'Australie.
Vous penseriez que Windows et Linux auraient une façon assez standard de faire quelque chose comme UTCtoLocal (const char * tzName, time_t inTime, struct tm * outTime) en tenant compte de toutes les règles DST dynamiques/historiques pour le temps zone donnée. tzName devrait être en mesure de prendre le nom approprié comme "Central Standard Time" ou "America/Chicago" selon le système que vous utilisez. Je serais même prêt à autoriser une étape de deux appels comme GetTimeZoneInformation (const char * tzName, TIME_ZONE_INFORMATION * outTZInfo) UTCtoLocal (const TIME_ZONE_INFORMATION * dansTZInfo, time_t inTime, struct tm * outTime) Vous savez que l'OS est déjà en train de faire ceci quand il charge l'information de fuseau horaire de système et les bibliothèques font des conversions locales/UTC.
y at-il un équivalent linux?Ou mieux une bibliothèque qui l'encapsule? Je vais vérifier boost;) – neuro
Soyez prudent, cependant, si vous voulez prendre en compte les changements historiques des dates de transition. Par exemple. Les États-Unis et l'Australie ont récemment modifié les dates pour lesquelles ils changent entre l'heure d'été et l'heure normale, et un horodatage donné de 2003 est soumis à des règles différentes de celles d'un timestamp donné en 2008. –
Boost a Boost.Date_Time [1], contenant un base de données de fuseaux horaires, entre autres choses. Je ne l'ai pas utilisé, donc je ne peux pas garantir sa qualité. [1] http://www.boost.org/doc/libs/1_39_0/doc/html/date_time.html –