Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abweichung von UTC bekommen (https://www.delphipraxis.net/92681-abweichung-von-utc-bekommen.html)

Andreas L. 24. Mai 2007 09:54


Abweichung von UTC bekommen
 
Hi,
ich muss ein Datum + Uhrzeit in folgenden Format darstellen:

Zitat:

Format: 2005-01-08T17:10:47-05:00
-05:00 ist die Abweichung von UTC. Doch wie bekommen ich diese Abweichung?

Bisher habe ich nur folgendes:

Delphi-Quellcode:
 
var
 bla: String;
begin
 bla:= FormatDateTime('yyyy-mm-ddhh:nn:ss', Now);
 Insert('T', bla, 9);
Gibt es eine Funktion die mir diese Abweichung übergibt?

chaosben 24. Mai 2007 10:17

Re: Abweichung von UTC bekommen
 
Zitat:

Zitat von Das Microsoft Platform SDK
GetTimeZoneInformation

The GetTimeZoneInformation function retrieves the current time-zone parameters. These parameters control the translations between Coordinated Universal Time (UTC) and local time.

:)

Andreas L. 24. Mai 2007 10:21

Re: Abweichung von UTC bekommen
 
Ich habe mir das im PSDK mal angeschaut. Aber wie verwende ich das?

Zitat:

DWORD GetTimeZoneInformation(
LPTIME_ZONE_INFORMATION lpTimeZoneInformation
);


chaosben 24. Mai 2007 10:42

Re: Abweichung von UTC bekommen
 
Z.B. so:
Delphi-Quellcode:
var
  tzi : TTimeZoneInformation;
begin
  GetTimeZoneInformation(tzi);
  MessageDlg(intToStr(tzi.Bias), mtWarning, [mbOK], 0);
end;

Andreas L. 24. Mai 2007 10:47

Re: Abweichung von UTC bekommen
 
Hmm... das gibt mir jetzt -60 zurück. Also -1 Stunde. Haben wir hier in Deutschland nicht +1 Stunde?

Luckie 24. Mai 2007 10:53

Re: Abweichung von UTC bekommen
 
Sommer- und Winterzeit berücksichtigt?

Andreas L. 24. Mai 2007 10:56

Re: Abweichung von UTC bekommen
 
Zitat:

Zitat von Luckie
Sommer- und Winterzeit berücksichtigt?

Ähm... Nö, hab nru den Code von chaosben kopiert. Wie berücksichtige ich denn die Sommer- und Winterzeit?

Luckie 24. Mai 2007 10:59

Re: Abweichung von UTC bekommen
 
In dem du sie entsprechend dazu addierst oder abziehst oder wie auch immer. Und bevor du fragst: MSDN-Library durchsuchenGetTimeZoneInformation!

Andreas L. 24. Mai 2007 11:06

Re: Abweichung von UTC bekommen
 
Auf den von dir verlinkten Artikel war ich ja schon. Aber dort steht nirgendwo was wie man herausbekommt ob gerade Sommer- oder Winterzeit ist. Wie lautet denn die benötigte Funktion?

shmia 24. Mai 2007 11:07

Re: Abweichung von UTC bekommen
 
Delphi-Quellcode:
// liefert den Abstand der lokalen Zeit zu UTC
// UTC = lokaleZeit + GetTimeZoneBias
function GetTimeZoneBias:TDateTime;
const
   MINUTES_PER_DAY = 24.0 * 60.0;
var
  tzi : TTimeZoneInformation;
begin
   case GetTimeZoneInformation(tzi) of
      TIME_ZONE_ID_STANDARD:
         result := (tzi.Bias) / MINUTES_PER_DAY;

      TIME_ZONE_ID_DAYLIGHT: // Sommerzeit
         Result := (tzi.Bias+tzi.DaylightBias) / MINUTES_PER_DAY;
   else
      Result := 0.0;
   end;
end;

Luckie 24. Mai 2007 11:25

Re: Abweichung von UTC bekommen
 
Zitat:

Zitat von Andreas L.
Auf den von dir verlinkten Artikel war ich ja schon. Aber dort steht nirgendwo was wie man herausbekommt ob gerade Sommer- oder Winterzeit ist. Wie lautet denn die benötigte Funktion?

*mit-dem-Kopf-schüttel*:
Zitat:

Return Value

If the function succeeds, it returns one of the following values.
TIME_ZONE_ID_UNKNOWN
TIME_ZONE_ID_STANDARD
TIME_ZONE_ID_DAYLIGHT

Andreas L. 24. Mai 2007 11:33

Re: Abweichung von UTC bekommen
 
Ich dachte immer DayLight heißt Tageslicht :|

chaosben 24. Mai 2007 11:37

Re: Abweichung von UTC bekommen
 
*den Namen zu "René Descartes" wechsel*

Die Sommerzeit heißt im Englischen "Daylight Saving Time" oder kurz DST.

*wieder Benjamin bin*

Luckie 24. Mai 2007 11:53

Re: Abweichung von UTC bekommen
 
Zitat:

Zitat von Andreas L.
Ich dachte immer DayLight heißt Tageslicht :|

Nun ja, wenn man seinen Kopf etwas bemüht, dann könnte man zu dem Schluss kommen, dass es wohl keine Zeitzone geben wird, die eine Tag- und Nachtzeit hat. Und demzufolge es sich eigentlich nur um die Sommerzeit handeln kann.

Andreas L. 24. Mai 2007 12:20

Re: Abweichung von UTC bekommen
 
Hab den Code jetzt ein bisschen modifiziert. Bekomme jetzt aber -2 Stunden:

Delphi-Quellcode:
function TXSPF.GetTimeZoneBias:String;
var
  tzi : TTimeZoneInformation;
begin
   case GetTimeZoneInformation(tzi) of
      TIME_ZONE_ID_STANDARD:
         result := intToStr(tzi.Bias div 60);

      TIME_ZONE_ID_DAYLIGHT: // Sommerzeit
         Result := IntToStr((tzi.Bias + tzi.DaylightBias) div 60);
   else
      Result := '00';
   end;
end;

Luckie 24. Mai 2007 12:46

Re: Abweichung von UTC bekommen
 
Man vergleiche:
shmia:
Delphi-Quellcode:
function GetTimeZoneBias:TDateTime;
const
   MINUTES_PER_DAY = 24.0 * 60.0;
var
  tzi : TTimeZoneInformation;
begin
   case GetTimeZoneInformation(tzi) of
      TIME_ZONE_ID_STANDARD:
         result := (tzi.Bias) / MINUTES_PER_DAY;

      TIME_ZONE_ID_DAYLIGHT: // Sommerzeit
         Result := (tzi.Bias+tzi.DaylightBias) / MINUTES_PER_DAY;
   else
      Result := 0.0;
   end;
end;
du:
Delphi-Quellcode:
function TXSPF.GetTimeZoneBias:String;
var
  tzi : TTimeZoneInformation;
begin
   case GetTimeZoneInformation(tzi) of
      TIME_ZONE_ID_STANDARD:
         result := intToStr(tzi.Bias div 60);

      TIME_ZONE_ID_DAYLIGHT: // Sommerzeit
         Result := IntToStr((tzi.Bias + tzi.DaylightBias) div 60);
   else
      Result := '00';
   end;
end;

Andreas L. 24. Mai 2007 13:11

Re: Abweichung von UTC bekommen
 
Wenn ich div (24 * 60) verwende, bekomme ich als Ergebniss 30. :wiejetzt:

alex517 24. Mai 2007 14:08

Re: Abweichung von UTC bekommen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ggf wäre noch folgendes zu beachten:

GetTimeZoneInformation gibt aktuellen Bias also passend zum Systemdatum zurück.
Das wäre heute den 24.05.2007 die Sommerzeit, also +02:00.

Wenn der HEUTE zu konvertierende Zeitpunkt z.B. der 18.02.2007 16:30 ist, so
galt am 18.02.2007 aber die Normal(Winter)zeit also +01:00.
18.02.2007 16:30 --> "18.02.2007T16:30:00+02:00" wär damit falsch!

Besonders interessant wird die Geschichte in den Nächten der Umstellung.

Aber vielleicht denke ich ja auch zu komplizert?!?

alex

Andreas L. 24. Mai 2007 14:47

Re: Abweichung von UTC bekommen
 
Die Unit beinhaltet genau das was ich brauche: DateTime2XML und wieder zurück :-)

Danke. Darf man die mit einer OpenSource-Komponente weitergeben?

shmia 24. Mai 2007 14:50

Re: Abweichung von UTC bekommen
 
Zitat:

Zitat von Andreas L.
Hab den Code jetzt ein bisschen modifiziert.

Ich fand den Code vorher besser!!
Wichtig ist auch die Formel : UTC = lokaleZeit + GetTimeZoneBias
Folgende Zeile zeigt die Zeit nach UTC an:
Delphi-Quellcode:
ShowMessage(DateTimeToStr(Now + GetTimeZoneBias)+ '[UTC]');
Der Abstand zwischen UTC und Lokaler Zeit ist:
lokaleZeit - UTC = -GetTimeZoneBias
Man beachte das Minuszeichen das sich nach der Formelumstellung ergibt!!
Also alles richtig; man muss es nur richtig interpretieren:
Delphi-Quellcode:
ShowMessage('Zeitunterschied lokale Zeit zu UTC: ' +TimeToStr(-GetTimeZoneBias));

alex517 24. Mai 2007 14:57

Re: Abweichung von UTC bekommen
 
Zitat:

Zitat von Andreas L.
Die Unit beinhaltet genau das was ich brauche: DateTime2XML und wieder zurück :-)

Danke. Darf man die mit einer OpenSource-Komponente weitergeben?

Wenn es hilft. Ist ja je nur teilweise auf meinem Mist gewachsen, siehe Quellenangabe.
Ich würde aber noch die Diskussion abwarten.

alex

Mazel 30. Mai 2007 08:46

Re: Abweichung von UTC bekommen
 
Wenn ich jetzt noch nachfragen darf, auf welchen Wert habt ihr euch nun geeinigt? Während der Winterzeit und Sommerzeit? Ich habe gedacht, dass in Deutschland die Abweichung immer zu UTC 1h ist, denn die Engländer stellem auch auf Sommerzeit um. Jetzt habe ich mir aber überlegt, dass UTC sich nicht ändert, so wäre auch England, was im Winter UTC+0 ist im Sommer UTC+1 ist, demnach in Detuschland UTC+2 im Sommer.
Ist diese Überlegung so richtig?

Demnach muss, wie es auch in der MSDN steht, Bias und DailightBias adiert werden um von der lokalen Zeit auf die UTC Zeit zu kommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.

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