Erhalte Sommerzeit-Übergangszeiten für Zeitzonen in C

8

Gibt es in C eine einfache, plattformübergreifende Möglichkeit, die Daten abzurufen, die eine bestimmte Zeitzone beginnt und die Sommerzeit beendet?

Ich habe bereits Zeitzonen-Offset-Informationen und ob Sommerzeit derzeit beobachtet wird, aber ich brauche wirklich die Daten, an denen die Sommerzeit beginnt und endet (für eine externe Abhängigkeit, die ich nicht kontrolliere). In Windows verwende ich GetTimeZoneInformation , um TimeZoneInfo , aber ich kann keine ähnliche Funktion für Linux / Solaris / Mac finden. Ich sollte auch darauf hinweisen, dass ich mich nicht einfach auf die US-Regeln für die Einführung von Sommergeld verlassen kann, da ich nicht vorhersagen kann, in welchen Ländern es verwendet wird.

Die einzige Möglichkeit, die ich kenne, um diese Informationen zu erhalten, ist über zdump oder vielleicht direkt auf die / usr / share / lib / zoneinfo selbst, aber ich habe auf eine bessere Lösung gehofft.

Vielen Dank für Ihre Hilfe.

    
user82116 24.03.2009, 17:36
quelle

4 Antworten

5

Der portable und konsistente Weg, damit umzugehen, besteht darin, eine ganzjährige TZ-Offset-Tabelle (für jeden Tag des aktuellen Jahres in der aktuellen Zeitzone) zu erstellen Anwendungsstart. Beheben Sie die lokale Mitternachtszeit jeden Tag um UTC (GMT), und notieren Sie den effektiven Zeitzonenausgleich gegenüber UTC (GMT) für den fraglichen Tag. Suchen Sie nach Übergängen in den effektiven TZ-Offsets das ganze Jahr über (Übergänge zeigen DST-Änderungen an.) Dieser Ansatz ist konsistent und portabel , das nur davon abhängt, ob localtime / gmtime auf der Plattform zuverlässig funktioniert Frage, und wird Ergebnisse in voller Übereinstimmung mit localtime / gmtime -Aufrufen zurückgeben. Es wird jedoch ein bisschen komplizierter, wenn Sie DST-Informationen für andere Zeitzonen benötigen (als die Standardzeitzone des Prozesses).

Sie können auch direkt die TZ / Olson-Datenbank (Code verwenden verfügbar für sowohl * nix als auch für Windows), für maximale Flexibilität , es sei denn, die zugrunde liegende Laufzeit / das Betriebssystem verwendet exakt die gleichen Zeitzoneninformationen (und Ihre Anwendung verwendet TZ / Olson Zeitzoneninformationen und gmtime / localtime austauschbar) dann sind Sie für unangenehme Überraschungen.

    
vladr 24.03.2009 18:10
quelle
2

Ich bin mir nicht sicher, ob es eine gute plattformübergreifende Möglichkeit gibt, dies zu tun, aber es gibt eine programmatische Schnittstelle zu den /usr/share/zoneinfo -Dateien (oder zumindest eine Beschreibung des Formats) in tzfile.h , (verfügbar unter Mac OS X und Linux).

Windows verwendet leicht unterschiedliche Zuordnungen von tzinfo, aber es gibt eine Konvertierungstabelle , die Sie verwenden könnten Generieren Sie Ihre Schnittstelle zwischen Windows und Unix.

    
tgamblin 24.03.2009 17:57
quelle
1
  

In C gibt es eine einfache, plattformübergreifende Möglichkeit, die Daten einer bestimmten Zeitzone & gt; beginnt und endet die Sommerzeit?

Nein.

Ich habe in den späten 90er Jahren die TZ-Unterstützung auf VMS für DEC implementiert.

Erstens gibt es keine plattformübergreifende Lösung.

Zweitens variieren die Daten von Jahr zu Jahr und auch durch legislative Fiat. Es gibt in der Tat keine vollständig zuverlässige programmatische Lösung.

    
user82238 24.03.2009 22:01
quelle
0

Wenn Sie C ++ (nicht C) benötigen, schauen Sie nach boost :: date_time library Ссылка

    
Dmitriy 13.08.2009 05:30
quelle

Tags und Links