![]() |
Berechnung:Ist grade Sommerzeit in einer bestimmter Zeitzone
Hallo,
ich bin gerade dabei ein kleines Tool zu schreiben, welches mir die aktuelle Zeit an zwei Orten auf der Welt anzeigen soll. Der 1. Ort ist klar der Standort des Rechners also quasi das hier und jetzt. Der zweite Ort soll hingegen ein beliebiger Ort sein. Alles soweit klein Problem die aktuelle Zeit bekommt man ja Problemlos durch "Now" geliefert. Möchte ich z.b. wissen wie spät es jetzt in Neuseeland ist, muss ich wissen bzw. angeben in welcher Zeitzone sich der Ort befindet und ob zur zeit Sommer oder "Winterzeit" herrscht.
Delphi-Quellcode:
Das funktioniert soweit wunderbar, jedoch ist die Zeit falsch, da zur Zeit in Neuseeland Sommerzeit (+1 Std.) ist, müsste
procedure TForm1.Timer1Timer(Sender: TObject);
var sysTime : SYSTEMTIME; dtRemote : TDateTime; begin //Aktuelle Uhrzeit anzeigen lblLocalTime.Caption := FormatDateTime('hh:nn:ss', Now); //Aktuelle UTC Zeit ermitteln GetSystemTime(sysTime); //UTC in DateTime wandeln dtRemote := EncodeDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMillisecond); //Zone "UTC+12 Neuseeland - Hauptgebiet" addieren dtRemote := IncHour(dtRemote, 12); //Ortszeit Neuseeland anzeigen lblRemoteTime.Caption := Format('hh:nn:ss', dtRemote); ich noch eine Stunde drauf rechnen, jetzt zum großen Problem. Gibt es eine Möglichkeit an die Informationen mit Windows Bordmitteln zu gelangen oder muss ich das selbst machen. Ich müsste jetzt mühselig "alle" Sommerzeitregelungen aus dem Internet recherchieren und durch aufwendige If-Anweisungen herausfinden ob in der jeweiligen Zeitzone zur Zeit Sommer oder Winterzeit/Normalzeit herrscht. Beim Beispiel von Neuseeland wäre die Regelung wie folgt. Sommerzeit Beginn: Letzter Sonntag vor dem 1.Oktober (27.09.09) Sommerzeit Ende: Erster Sonntag nach dem 1.April (05.04.10) Meine Hoffnung das es irgendwie einen Trick gibt besser an die Information zu kommen. Das ganze ist ein Delphi 2007 Prof. Projekt und sollte ab Windows XP oder höher funktionieren. mfg TUX |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Ist doch einfach
- du hast 'ne Definition "letzter Sonntag vor dem 1. Oktober" - also nimmt man sich das Datum und sucht den Sonntag davor. Das kann man jetzt einfach mit 'ner Schleife machen oder man versucht sich an Mathe > DayOfWeek oder DayOfTheWeek und dann rechnen
Delphi-Quellcode:
(vermutlich)
T := TDateTime(1. Oktober des Jahres) - 1;
T := T - (6 - DayOfWeek(T)); |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Hi,
...aber immer bedenken, dass die wenigsten Länder die Sommerzeit kennen :-D Alex |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Zitat:
|
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Zitat:
selber sagen kann, um mir den Aufwand zu sparen für alle Länder/Zeitzonen mit Sommerzeit solch eine Abfrage zu bauen. Da sich solche Sachen ja auch mal ändern können. Ich hatte mal gesehen das Win XP Änderung an irgendwelchen Zeitregelungen per Update mitgeteilt worden sind, dann würde mein Programm solange "richtig" laufen wie Windows XP selbst korrekt die Zeitumstellungen kennt. Windows müsste das doch selbst wissen nur ich frag mich wie ich an diese Information heran komme, ich hatte schon überlegt ob man die System-Zeitzone auf die gewünschte ändert und dann eine Abfrage macht ob Sommerzeit aktiv ist oder nicht. Besonders elegant fände ich das zwar nicht, aber selbst diese Lösung wüsste ich gerade nicht zu realisieren. Ich denke und befürchte ich komme um ein "Gebilde" wie folgt nicht herum. Zitat:
|
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
OK, hatter verstanden, daß du es selber errechnen willst. :lol:
Du könntest dich mit einem Time-Server in Verbindung setzen und dieses fragen. :angel: ![]() ![]() ![]() ![]() |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Also prinzipiell müsste Windows die Infos ja wirklich haben. Allerdings habe ich es bisher nur gebraucht, um die aktuell eingestellte Zeitzone nach UTC zu konvertieren, prinzipiell sollte es damit aber auch möglich sein, zwischen verschiedenen Zonen hin und her zu wandeln. Guck zum Beispiel nach
![]() Einige dieser Zeit-Funktionen von Windows sind in Delphi nicht von Haus aus vorhanden, so dass du sie erst selbst importieren musst, zum Beispiel:
Delphi-Quellcode:
Vielleicht findest du ja mit diesen Geschichten bei MSDN etwas. Auf jeden Fall hat Windows die nötigen Infos...
[...]
implementation function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime'; Bis denn Bommel Edit: Kleiner Nachtrag... Such mal in dem oben erwähnten MSDN-Artikel nach dem Abschnitt "Remarks: Settings for each time zone are stored in the following registry key:" - Da wirst du dann die nötigen Infos finden. Es wird also wohl nicht einfach, aber es scheint zu gehen. :) |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Ich hab die andere Richtung, vielleicht hilfts:
Delphi-Quellcode:
lg
function UTCToLocalTime(dateTime: TDateTime): TDateTime;
var Info: TTimeZoneInformation; Status: DWORD; begin Status := GetTimeZoneInformation(Info); if (Status = TIME_ZONE_ID_UNKNOWN) or (Status = TIME_ZONE_ID_INVALID) then raise Exception.Create('Zeitzone ungültig'); result := IncHour(dateTime, (Info.Bias div 60) * -1); result := IncMinute(result, (Info.Bias - ((Info.Bias div 60) * 60)) * -1); if Status = TIME_ZONE_ID_DAYLIGHT then begin result := IncHour(result, (Info.DaylightBias div 60) * -1); result := IncMinute(result, (Info.DaylightBias - ((Info.DaylightBias div 60) * 60)) * -1); end; end; hazard |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Hmm alles soweit ganz gut, man fühlt sich kurz vor dem Ziel, weil alles was man eigentlich braucht ist die vorhandene
Funktion "GetTimeZoneInformation" jedoch nicht fest mit der aktuellen sondern mit einer beliebigen Zeitzone. Mein Ansatz ist erst mal eine Liste aller Zeitzonen zu bekommen die jeweils aus der TIME_ZONE_INFORMATION Struktur besteht. Nur wie weiß ich noch nicht so ganz wie ich an diese Liste kommen soll. |
Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
Eventuell findest du ja über
![]() ansonsten kannst du immernoch die Registry auslesen (Pfad siehe ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz