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.
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%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.
Ondra C. -
Ja, Sie haben Recht. Sie müssen:
Setzen Sie eine Delphi TDateTime-Variable auf das gewünschte Datum / die gewünschte Uhrzeit
Konvertiere es in Windows SystemTime
Rufen Sie GetTimeZoneInformation () auf, um TTimeZoneInformation
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 ).
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
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
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%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.
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%