Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Berechnung:Ist grade Sommerzeit in einer bestimmter Zeitzone (https://www.delphipraxis.net/143842-berechnung-ist-grade-sommerzeit-einer-bestimmter-zeitzone.html)

TUX_der_Pinguin 24. Nov 2009 14:28


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:
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);
Das funktioniert soweit wunderbar, jedoch ist die Zeit falsch, da zur Zeit in Neuseeland Sommerzeit (+1 Std.) ist, müsste
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

himitsu 24. Nov 2009 14:45

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:
T := TDateTime(1. Oktober des Jahres) - 1;
T := T - (6 - DayOfWeek(T));
(vermutlich)

BigAl 24. Nov 2009 14:48

Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
 
Hi,

...aber immer bedenken, dass die wenigsten Länder die Sommerzeit kennen :-D


Alex

Luckie 24. Nov 2009 15:07

Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
 
Zitat:

Zitat von himitsu
Ist doch einfach

Nur leider nicht weltweit einheitlich und das ist sein Problem.

TUX_der_Pinguin 24. Nov 2009 15:07

Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
 
Zitat:

Zitat von himitsu
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:
T := TDateTime(1. Oktober des Jahres) - 1;
T := T - (6 - DayOfWeek(T));
(vermutlich)

Das war mir schon klar, das ich die Regel "nur" umsetzten brauche. Ich hatte mich nur gefragt ob mir das evtl. Windows nicht
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:

function IsSummerTime(Zone);

case ZeitZone of
Neuseeland : begin
//Regelung Siehe oben
result := True;
end;

Europa : begin
....
result := False;
end;
end;

....
end;

himitsu 24. Nov 2009 15:22

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:


MSDN-Library durchsuchenmsdn sommerzeit
http://msdn.microsoft.com/de-de/magazine/cc163425.aspx
http://www.google.de/url?q=http://ms.../bb979254.aspx
http://www.google.de/url?q=http://ms.../bb978960.aspx

Bbommel 24. Nov 2009 15:29

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 Delphi-Referenz durchsuchenTzSpecificLocalTimeToSystemTime und hangele dich von da aus durch.

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:
[...]
implementation

function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';
Vielleicht findest du ja mit diesen Geschichten bei MSDN etwas. Auf jeden Fall hat Windows die nötigen Infos...

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. :)

hazard999 24. Nov 2009 16:24

Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
 
Ich hab die andere Richtung, vielleicht hilfts:

Delphi-Quellcode:
   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;
lg

hazard

TUX_der_Pinguin 25. Nov 2009 08:54

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.

himitsu 25. Nov 2009 09:02

Re: Berechnung:Ist grade Sommerzeit in einer bestimmter Zeit
 
Eventuell findest du ja über Bei Google suchenenumerate timezone etwas,
ansonsten kannst du immernoch die Registry auslesen (Pfad siehe MSDN-Library durchsuchenGetTimeZoneInformation)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz