2012-05-10 11 views
7

Ich habe die folgenden Zweifel an der Verwendung von tm_isdst Flag in der tm-Struktur. Wie pro Mann Seiten und Ergebnisse gegoogelt verstehe ich, dass sein Wert interpretiert wird alsmktime und tm_isdst flag

A.

folgt DST Ein Wert von 0 zeigt ist in der Tat für die dargestellte Zeit nicht

B. Ein Wert von 1 bedeutet, ist DST in der Tat

C. Ein Wert von -1 bewirkt, dass mktime überprüft, ob DST in Kraft ist oder nicht.

Es ist dieser dritte Punkt, der mich verwirrt. Mein Zweifel ist, wie mktime herausfinden kann, ob DST angewendet werden muss oder nicht.

Zum Beispiel

My Time Zone = GMT + 3:00 
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple) 
Current UTC time = "01/Jan/2012 00:00:00" 
UTC time in seconds time_t timetUTC = X seconds 
Hence my time is = "01/Jan/2012 03:00:00" 

Wie die Zeit vergeht, meine Zeit Wert ändert sich wie folgt

"01/Jan/2012 04:00:00"   (X + 1 * 60 * 60) 
"01/Jan/2012 05:00:00"   (X + 2 * 60 * 60) 
"01/Jan/2012 05:59:59"   (X + 2 * 60 * 60 + 59) 
"01/Jan/2012 05:00:00"   (X + 3 * 60 * 60) 
"01/Jan/2012 06:00:00"   (X + 4 * 60 * 60) 

Gemäß meinem Verständnis

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0 
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1 

Auf diese Weise, auch wenn alle anderen Komponenten von Die Struktur ist in beiden Fällen gleich, mktime (tmMyTime) kann p zurückgeben Roper UTC-Wert, abhängig vom Wert von tm_isdst.

Wenn ich nun tmMyTime.tm_isdst = -1 setze, welchen Wert würde mktime zurückgeben? Ich lese über TZ-Variable, Zeit-Datenbank usw. usw. Trotz all dem, wie kann mktime() herausfinden, ob die DST-Korrektur angewendet werden soll oder nicht für die tm-Werte, die zweimal auftreten können?

Wir haben keine Sommerzeit in unserer Zeitzone. Daher bin ich mir nicht sicher, ob mein Verständnis korrekt ist. Bitte korrigieren Sie mich, wenn ich falsch liege. Deine Hilfe ist sehr Willkommen.

+4

Sie haben festgestellt, dass die Ortszeit mehrdeutig ist. Es ist. –

Antwort

4

Kurz gesagt: es ist abhängig von der Implementierung.

mktime kennt die DST-Regeln, indem das Gebietsschema überprüft wird.

Für den größten Teil des Jahres kann mktime herausfinden, ob DST für eine bestimmte Ortszeit angewendet werden soll. Das Problem ist in der Tat die "doppelte" Stunde, wenn sich DST rückwärts bewegt (in Ihrem Beispiel 05:00:00 - 05:59:59). Für diesen lokalen Zeitbereich kann mktime bei gegebener tm_isdst = -1 nicht wissen, ob DST wirksam ist oder nicht. Welche davon ausgewählt wird, unterscheidet sich von Implementierung zu Implementierung. Mit der GNU-Version von mktime wird die UTC vor der Schicht zurückgegeben.

+1

Danke Pat. Bestenfalls kann mktime nur so viel machen, was ich auch gefühlt habe. Aber nirgends (einschließlich Manpage) gab es eine klare Beschreibung bezüglich der Handhabung dieser zweideutigen 1 Stunde. Ich wurde mehr verwirrt, als ich ein absichtliches Zurücksetzen dieses Flags auf -1 in unserer Codebasis jedes Mal nach einem "tm = localtime_r (time_t)" bemerkte. Zumindest in diesem Fall dachte ich, die Flagge sollte unberührt bleiben. Ich glaube auch, dass Implementierungen dieses Verhalten in Manpage eindeutig angeben sollten. Entweder sollte eine Standardfunktion immer ein korrektes Ergebnis liefern oder Fehler bei einem Fehler werfen oder zumindest Abweichungen in der Manpage angeben. – mpathi

+0

Gute Antwort. Das Problem hier ist, dass, wenn alle Benutzer uns passieren, ist etwas wie eine "struct tm", und unsere einzige Schnittstelle zu Zeitzone Informationen ist Posix 'mktime()', dann können wir auch nicht portabel um das Problem selbst programmieren. Entweder können wir den Benutzer zwingen zu spezifizieren, welcher "3. November 2013 um 1.30 Uhr" sie uns geben, oder wir können einfach 'tm_isdst = -1' setzen und auf das Beste hoffen. –

1

Ich denke, es wird etwas von Ihrer Plattform abhängig sein. Unter Windows gibt die mktime() -Dokumentation mindestens Folgendes an: "Die C-Laufzeitbibliothek übernimmt die Regeln der Vereinigten Staaten für die Implementierung der Sommerzeitberechnung". Sie enthält also eine Regeltabelle, in der sie bestimmen kann, wann die Sommerzeit gestartet wurde. endete in einem bestimmten Jahr.

Sie haben Glück, DST nicht zu haben, wo Sie sind. In meiner Welt, die Echtzeitdatenerfassung und -präsentation ist, ist DST ein großes Ärgernis!

+0

Danke für die Antwort. Es ist jedoch immer noch nicht klar, wie mktime() das tun kann. Da zwei UTC-time_t-Werte in lokaler Zeitzone den gleichen tm-Wert haben können (außer is_dst), und wenn ich dieses Flag alleine auf -1 zurücksetze, hat die Funktion mktime() logisch keine Ahnung, welcher der UTC-Werte es sein sollte wandle es zurück in – mpathi

1

tm_isdst kann nicht im Allgemeinen mehrdeutige Zeiten auflösen. Das liegt daran, dass viele Zeitzonen Übergänge (einmal) haben, ohne von dst zu nodst zu springen, nur Offset und Zonenabkürzung zu ändern. Also beide Male (vor und nach dem Übergang) haben die gleichen tm_isdst. Einige andere Zonen ändern tm_isdst beim Umschalten Sommer/Winterzeit, ändert aber nicht die Abkürzung (Australien/Melbourne zum Beispiel).