2016-04-15 27 views
2

Angenommen, meine Windows-Serveranwendung wird in einer Eastern Time Zone (NY) ausgeführt.So erhalten Sie den Sommerzeitstatus einer anderen Zeitzone

Ich konvertiere und speichere jedes Datetime-Ereignis (den Moment, in dem es passiert) in UTC, so dass jede Client-Anwendung, die eine Verbindung zum Server herstellt, die UTC-Zeit des Ereignisses liest und konvertiert und in der eigenen TZ anzeigt.

Aber hier ist der knifflige Teil, einige Ereignisse melden ihren Zeitstempel zu einem anderen Zeitpunkt und nicht explizit Sommerzeit Informationen (zB xx: xx: xx AM PT, was bedeutet Pacific Time, aber ich weiß nicht, ob es derzeit in der Sommerzeit).

Der Server könnte überprüfen, ob es in der Sommerzeit ist, aber das wäre für Server eigenen TZ (Eastern Time). Das Beste, was ich mir vorstellen konnte, ist, die lokalen Sommer-Spar-Informationen des Servers zu lesen und diese auch für PT zu verwenden, aber ich weiß, dass das nicht 100% genau ist. Besonders durch das kurze Fenster, wenn ET gerade gestartet hat (oder gestoppt hat), Sommerzeit zu verwenden, und PT hat noch Stunden, um dies zu tun.

Nun meine Frage ist, gibt es eine Möglichkeit (in Windows API) genau über eine andere Zeitzone Sommerzeit Status unabhängig davon herauszufinden, welche Zeitzone die Server-App befindet?

Bearbeiten: ok, wie konvertiere ich dies in UTC "Sun, 13.03.2016, 01.15 Uhr PT", von einer Windows-Maschine, die in Eastern Time läuft? (Beachten Sie, dass dieses Datum/diese Uhrzeit speziell ausgewählt wurde, wenn der laufende Rechner (in ET) gerade im Sommer ist und Datum/Uhrzeit nicht konvertiert werden soll gerade noch in DST. Ich habe die UTC-Konvertierung abgedeckt, konnte aber nicht feststellen wenn aus der angegebenen Datum/Zeit ist in DST oder nicht.

+0

Does [diese vorherige Frage] (http://stackoverflow.com/questions/2532729/daylight-saving-time-and-time-zone-best-practices) Hilfe? –

+0

Wie identifizieren Sie die Zeitzone in Ihrer Anwendung? Wenn Sie nur Abkürzungen wie "PT" haben, können Sie das sehr schwierig oder unmöglich finden. Sind diese Eingaben auf bestimmte feste Werte beschränkt? Oder könnten sie buchstäblich alles sein? –

+0

@MattJohnson sie sind in der Regel HTTP-Standard-Datum/Uhrzeit Zeichenfolgen (die tatsächlich DST-Informationen enthalten, wie xx: xx: xx AM PST oder PDT, wenn DST aktiv ist), aber einige Server sind nicht so großzügig, um die DST-Informationen zur Verfügung zu stellen und einfach zu sagen dass es PT (Pasific Time) ist und Sie wissen lassen, ob PT zum angegebenen Zeitpunkt in DST ist oder nicht. Das System (Windows) sollte dies wissen, da es die Systemuhr am 2. und 1. Sonntag im März und November anpasst und dies dem Benutzer mit einer API bereitstellen könnte. –

Antwort

1

ich über den Windows-API bin nicht sicher, aber im allgemeinen, was Sie tun möchten, ist Anruf mktime, mit dem TZ Wert Ihrer Fernbedienung Zeit in Kraft. Unter Unix können Sie buchstäblich setenv("TZ", whatever) nennen, dies zu tun. Nicht sicher Windows, aber ich glaube, Sie dort die gleiche Art der Sache zu tun, auch.

es sicher wäre schön, wenn neben mktime und timegm gab es eine Variante, mit der Sie die Zone explizit angeben können (anstatt die TZ-Umgebungsvariable als globale Variable zu behandeln), aber eine solche Variante ist kein Standard.

Wenn Sie lokale Zeiten konvertieren, wenn Sie nicht wissen, ob DST in Kraft ist oder nicht, denken Sie daran, tm_isdst auf -1 zu setzen, damit die Bibliothek es für Sie herausfinden kann.

Hier ist ein Beispiel:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    struct tm tm = {0}; 
    time_t t; 
    tm.tm_hour = 12; tm.tm_min = 30, tm.tm_sec = 15;   /* 12:30:15 */ 
    tm.tm_year = 2005-1900; tm.tm_mon = 4-1; tm.tm_mday = 12; /* 2005-04-12 */ 
    tm.tm_isdst = -1; 
    setenv("TZ", "America/Los_Angeles", 1); 
    t = mktime(&tm); 
    setenv("TZ", "America/New_York", 1); 
    printf("%ld = %.24s\n", t, ctime(&t)); 
} 

Dies sagt Ihnen, dass das Los Angeles Zeit 00.30.15 entspricht die Unix (UTC) Zeit 1113334215 und die New York Zeit 15.30.15.


Nachtrag: das wird für Windows nicht helfen, entweder, aber wenn Sie nicht wie eine Umgebungsvariable aus Ihrem Programm jedes Mal, wenn Sie brauchen, um mit einer Zeit in einer anderen Zeitzone zu arbeiten, zu sehen wenn Sie die BSD-Funktionen tzalloc, localtime_rz und mktime_z verwenden können.

+0

Kleinster Punkt: am besten, um 'struct tm' zu füllen, wie' struct tm tm = {0}; 'vor dem Aufruf von' mktime() '. Diese Funktion verwendet alle Felder außer "tm_wday, tm_yday" und "struct tm" kann mehr als die normalerweise 9 Felder haben. – chux

+0

@chux Guter Punkt, behoben. –

+0

Haben Sie diesen Code tatsächlich unter Windows ausgeführt? Meiner Erfahrung nach achtet Windows nicht auf die Umgebungsvariable TZ. Das ist eine POSIX-Sache. Zur vorherigen Behandlung dieses Themas, siehe [Wie kann ein Windows-Programm vorübergehend seine Zeitzone ändern?] (Http://stackoverflow.com/q/2611017/33732) –

2

Windows-Zeitzone Daten tatsächlich in der Registry gespeichert:

HKLM 
    SOFTWARE 
    Microsoft 
     Windows NT 
     CurrentVersion 
      Time Zones 

"Zeitzonen" ist in der Tat, zwei Worte.

Jede Zeitzone verfügt über einen eigenen Unterschlüssel, und jeder Unterschlüssel hat einen TZI Wert, der eine binäre REG_TZI_FORMAT Struktur ist:

typedef struct _REG_TZI_FORMAT 
{ 
    LONG Bias; 
    LONG StandardBias; 
    LONG DaylightBias; 
    SYSTEMTIME StandardDate; 
    SYSTEMTIME DaylightDate; 
} REG_TZI_FORMAT; 

Die beiden relevanten Strukturelemente sind StandardDate und DaylightDate.

Siehe MSDN für weitere Informationen: TIME_ZONE_INFORMATION

+0

@Remy: Ich habe den Link hinzugefügt, um zu vermeiden, den Microsoft-Code zu duplizieren, der wahrscheinlich urheberrechtlich geschützt ist und nicht eindeutig als "fair use" -Richtlinien gekennzeichnet ist. –

+0

das hat nichts mit meiner Frage zu tun. Die Registrierung ist genau der Ort, an dem Windows die Zeitzoneninformationen den Benutzern anzeigt, damit sie die Zeitzonen ihrer Computer festlegen können. Was ich brauchte, war herauszufinden, ob ein anderer Staat (oder ein Land für diese Angelegenheit) gerade in DST ist oder nicht. –

+0

Es gibt Ihnen die Informationen, die Sie benötigen, um das herauszufinden. Die Mitglieder von 'DaylightDate'' SYSTEMTIME' haben, was Sie brauchen. –

Verwandte Themen