2009-07-17 3 views

Antwort

3

GetTimeZoneInformation ist, was Sie brauchen.

Sie können es aufrufen und den zurückgegebenen Wert prüfen, um festzustellen, ob die Sommerzeit zum Zeitpunkt des Anrufs aktiviert ist. Es füllt auch eine Struktur, die Regeln für die Umstellung auf Sommer- und Sommerzeit enthält. Wenn diese Struktur gefüllt ist und jede Zeit im UTC-Format angegeben wird, kann relativ einfach berechnet werden, ob diese Zeit der Sommerzeit oder der Standardzeit entspricht.

+0

Gibt es irgendein Linux-Äquivalent?Oder besser eine Lib, die es einkapseln? Ich überprüfe Boost;) – neuro

+1

Seien Sie vorsichtig, wenn Sie historische Änderungen an den Übergangsdaten berücksichtigen möchten. Z.B. Die USA und Australien haben kürzlich die Daten geändert, als sie zwischen Sommerzeit und Normalzeit wechseln, und ein bestimmter Zeitstempel aus 2003 lebt unter anderen Regeln als ein bestimmter Zeitstempel aus 2008. –

+0

Boost hat Boost.Date_Time [1], enthält a Zeitzonendatenbank, unter anderem. Ich habe es nicht benutzt, also kann ich nicht für seine Qualität bürgen. [1] http://www.boost.org/doc/libs/1_39_0/doc/html/date_time.html –

0

Alles schön und gut, aber GetTimeZoneInformation und GetDynamicTimeZoneInformation nur geben die aktuellen Einstellungen Zeitzone. Was ist, wenn die aktuelle TZ (d. H. Wo mein Server lebt) nicht die TZ ist, die ich überprüfen möchte?

Sagen wir, dass ich eine Server-App habe, die Bücher für die Kasse reserviert. Sie können sagen "Ich möchte es jetzt überprüfen" oder "Ich werde es in Zukunft bei datetime überprüfen müssen". Checkout-Zeiten werden in der lokalen Zeit des Benutzers eingegeben und vor dem Speichern in UTC konvertiert. Wenn der Benutzer seine Liste mit den Kassen ausgibt, werden die Zeiten für die Anzeige zurück in ihre lokalen Werte konvertiert.

Nehmen Sie an, dass der Server in New York lebt und unter Standard-DST-Regeln für die USA nach 2007 arbeitet. Die Zeitzone ist auf Ost-USA eingestellt, und es ist derzeit 27.07.2009 15:30 Uhr, also ist DST ON.

Benutzer in New York geben lokale Daten und Uhrzeiten ein. Konvertieren von ET nach UTC - kein Problem. Sie geben ein zukünftiges Datum ein - gut. Ich benutze einen der obigen zwei API-Aufrufe und finde es heraus.

Allerdings möchte ein Benutzer in Sydney eine Kasse reservieren. Sie fordert einen Checkout am 13.12.2009 18:25 Uhr bezüglich ihrer lokalen Zeitzone in Sydney an. Ich kann meine lokale TZ-Info nicht verwenden - Sydney und NY folgen nicht den gleichen DST-Regeln. Wie kann ich Sydneys aktuelle TZ-Informationen laden und herausfinden, ob ein beliebiges Datum DST ist oder nicht?

0

Es gibt einige neuere (aber immer noch unvollständige) Methoden auf MS-Windows für Win7 und Server2008/R2. Siehe KB 2731771. Siehe auch ICU und Boost :: locale. Die Windows-Routinen (GetTimeZoneInformationForYear) erfordern, dass Sie Ihre UTC soweit konvertiert haben, dass Sie das Jahr auf ein Minimum reduzieren. Glücklicherweise verschieben sich um den 1. Januar keine Zeitzonen, die mir bekannt sind. Sie können SystemTimeToTzSpecificLocalTime (Ex) verwenden, um die lokale Zeit korrekt in eine Zeitzone zu konvertieren, die sich von der Zeitzone des lokalen Systems unterscheidet. Ohne diese Methoden müssen Sie die Registrierung scannen, um die richtigen Zeitzoneninformationen und dynamischen Informationen zu laden, und dann SystemTimeToTzSpecificLocalTime aufrufen. Seien Sie vorsichtig mit Dingen wie _tzset und localtime, da einige Systeme (wie Windows) viele (meistens falsche) Dinge wie die US-DST-Regeln annehmen, selbst wenn Ihre TZ-Einstellungen für Australien sind.

Sie würden denken, dass sowohl Windows als auch Linux einige ziemlich standardmäßige Methoden wie UTCtoLocal (const char * tzName, time_t inTime, struct tm * outTime) unter Berücksichtigung aller dynamischen/historischen DST-Regeln für die Zeit haben Zone gegeben. tzName sollte in der Lage sein, den passenden Namen wie "Zentrale Standardzeit" oder "Amerika/Chicago" zu nehmen, abhängig davon, auf welchem ​​System Sie laufen. Ich würde sogar bereit sein, einen Zwei-Ruf-Schritt wie GetTimeZoneInformation (const char * tzName, TIME_ZONE_INFORMATION * outTZInfo) UTCtoLocal (const TIME_ZONE_INFORMATION * inTZInfo, time_t inTime, struct tm * outTime) Sie wissen, das OS tut bereits Dies wird beim Laden der Systemzeitzoneninformationen und der lokalen/UTC-Konvertierungen der Bibliotheken verwendet.

Verwandte Themen