Delphi - entspricht der C # DateTime.IsDaylightSavingTime () -Methode

8

Ich muss irgendwie feststellen, ob sich ein TDateTime -Wert innerhalb des Sommerzeitbereichs für meine Zeitzone befindet oder nicht (in C # ist dasselbe die Methode DateTime.IsDaylightSavingTime() ).

Ich weiß, dass es in Delphi keine ähnliche Funktion gibt, da Delphi TDateTime keine Informationen über die Zeitzone enthält, aber ich nehme an, dass es eine Art und Weise gibt, wie man das mit der Win32 API macht.

Ich habe Win32 API% %%%% und $%%%% Funktionen gesehen, aber ich verstehe nicht, wie Sie sie verwenden, also möchte ich Sie um Hilfe bitten. Vielen Dank im Voraus für irgendwelche Tipps.

Bearbeiten:

Beispiel:

In meiner Zeitzone (Mitteleuropäisch) hat die Sommerzeit dieses Jahr begonnen 28. März um 2 Uhr und endet am 31. Oktober 2010 um 3 Uhr.

Ich brauche eine Funktion mit Header:

%Vor%

wird GetTimeZoneInformation zurückgeben, wenn das Eingabedatum zwischen dem 28. März 2010 02:00 und dem 31. Oktober 2010 3:00 und GetTimeZoneInformationForYear wenn nicht ist.

(Das Beispiel ist nur für das Jahr 2010, aber ich würde es für alle Jahre arbeiten müssen.)

Noch einmal, ich weiß, dass die in TDateTime gespeicherten Informationen allein nicht ausreichen, aber ich denke, dass ich mit einer Win32-API-Funktion in der Lage sein sollte, z. Informationen über die aktuelle Zeitzone aus Windows-Einstellungen.

    
Ondra C. 10.08.2010, 12:39
quelle

7 Antworten

3

Es ist nicht so einfach wie es klingt, denn:

1) Das Umstellungsdatum zwischen Sommer- und Winterzeit ist nicht für alle Länder gleich.

2) Das Umstellungsdatum zwischen DST und Standardzeit ist nicht für alle Länder dasselbe Jahr (z. B. in Mitteleuropa war es früher der erste Sonntag im April, IIRC, jetzt ist es der letzte Sonntag im März) ). Die USA wechselten vom ersten Sonntag im April auf den zweiten Sonntag im März ab 2007.

Also - ein einfaches Datum ist nicht genug, Sie brauchen auch einen geografischen Ort.

Wenn Sie jedoch damit leben können, dass Sie sich auf die Umstellungstermine beschränken, die aus dem CURRENT Algorithmus für das CURRENT Jahr berechnet werden können das CURRENT Gebietsschema (Land) und dass dies für Daten sowohl in der Zukunft als auch in der Vergangenheit falsch sein kann, dann können Sie die Informationen in TIME_ZONE_INFORMATION zur Berechnung der Umschaltzeitpunkte verwenden:

%Vor%

Wenn ich die Jahre 2000 bis 2020 auf meinem PC (Central Europe Time Zone) durchlaufe, bekomme ich folgende Daten:

%Vor%

aber mindestens einige dieser Jahre sind falsch, weil sich der Algorithmus in den aufgeführten Jahren von meinem Gebietsschema geändert hat.

Ihre Funktion wäre dann:

%Vor%     
HeartWare 10.08.2010, 14:47
quelle
3

Vielleicht ist es zu viel für Ihre spezifische Anwendung, aber das Open-Source-Projekt " Olson-Zeitzonendatenbank für Delphi > "ermöglicht den Zugriff auf alle Zeitzonen , die vom Projekt tz-Datenbank unterstützt werden. Die tz-Datenbank erhält regelmäßige Updates mit den neuesten Änderungen oder Korrekturen für die Sommerzeit .

  

TZDB kann in Delphi 6, 7,   8., 9., 10., 2007, 2009, 2010 und XE oder   FreePascal 2.0 und höher. TZDB ist   Am besten mit Delphi XE verwendet   führt die TTimeZone-Klasse in RTL ein.

    
mjn 21.11.2010 17:24
quelle
1

Ondra C. -

Ja, Sie haben Recht. Sie müssen:

  1. Setzen Sie eine Delphi TDateTime-Variable auf das gewünschte Datum / die gewünschte Uhrzeit

  2. Konvertiere es in Windows SystemTime

  3. Rufen Sie GetTimeZoneInformation () auf, um TTimeZoneInformation

  4. zu erhalten
  5. Rufen Sie GetTimeZoneInformationForYear () mit Ihrer TTimeZoneInformation-Struktur auf, um DST-Informationen für Ihre Zeitzone zu erhalten (ich bin nicht sicher, wo Sie TTimeZoneInformation für eine beliebige Zeitzone erhalten würden - aber Sie sollten sie auf MSDN finden ).

  6. Machen Sie die Arithmetik, um zu sehen, ob Ihre Systemzeit nach TTZI.StandardDate (in diesem Fall ist es Standardzeit) oder nach TTZI.DaylightDate (in diesem Fall ist es DST) auftritt.

Alternativ ...

Vielleicht könnten Sie das einfach in eine Delphi-Tabelle umwandeln:

Ссылка

Für ein beliebiges Datum in einer beliebigen Zeitzone, sehen Sie einfach, ob das angegebene Datum in die Sommerzeit fällt oder nicht. Voila! Keine Microsoft APIs - nur eine einfache Tabellensuche oder wenn / sonst Fall blockieren!

'Ich hoffe, das hilft ... pSM

    
paulsm4 15.08.2010 22:00
quelle
0

Wie Sie selbst sagen, werden diese Informationen in Delphi nicht mit Datumsangaben gebündelt, so dass Sie diese nicht einfach portieren können. Jede Routine, die eine tdatetime ausführt, müsste diese Information hinzufügen, was in Delphi nicht der Fall ist.

Vielleicht solltest du mehr erklären, was du wirklich versuchst, und das Problem weniger durch Analogie beschreiben

    
Marco van de Voort 10.08.2010 13:00
quelle
0

Ich habe den .net-Reflektor verwendet, um die Implementierung dieser Funktion in .net anzuzeigen. Es ist wie folgt definiert, vielleicht können Sie die Mathematik in Delphi umwandeln? Wenn Sie weiter darüber nachdenken müssen, empfehle ich Reflector für sich selbst zu öffnen. Ich denke, es wird dir helfen!

%Vor%     
Steve Sheldon 12.08.2010 21:34
quelle
0

Ein Beispiel dafür finden Sie in der JEDI Code Library (Open Source) in der Unit JclDateTime.pas, in die LocalDateTimeToDateTime-Funktion. Die Informationen zur Sommerzeit werden abgerufen und für die Konvertierung in und aus der UTC-Zeit verwendet.

    
Bork Blatt 13.08.2010 11:47
quelle
0

Ich weiß, dass dies keine Antwort auf Ihre Frage ist, aber Sie könnten an den folgenden zwei Funktionen interessiert sein: SystemTimeToTzSpecificLocalTime() und TzSpecificLocalTimeToSystemTime() . Der erste konvertiert die Universalzeit in eine entsprechende Zeit für die angegebene Zeitzone (wobei nil für Ihre lokale Zeitzone steht). Das andere funktioniert umgekehrt, ist aber nur in Windows XP und höher enthalten, wie Borland Help sagt. Wenn Sie nur eine zeitzonenabhängige Zeitkonvertierung durchführen, sollten diese für Sie in Ordnung sein. Und es ist gut zu wissen, dass sie überprüfen, ob die angegebene UTC-Zeit eine DST- oder Standardzeit ist. Ich habe es jedoch nirgends gelesen. Ich habe es nur selbst überprüft, also korrigiere mich bitte, wenn ich falsch liege.

Bitte, sehen Sie die folgende Funktion. Ich bin mir nicht sicher, ob ich es irgendwo benutzen würde, denn ich bin mir nicht sicher, ob es korrekt ist, aber es könnte sich sehen lassen. Und bitte, erzähl mir nicht, dass es eine dumme Methode ist, denn ich weiß das: -).

%Vor%     
Mariusz Schimke 10.10.2010 08:45
quelle

Tags und Links