Entwickler-Ecke

Sonstiges (Delphi) - Zeitumstellung - Wie verhält sich Delphi?


matze - Mo 30.03.09 20:54
Titel: Zeitumstellung - Wie verhält sich Delphi?
Hallo.

Aus aktuellem Anlass ;-) kam mir diese Frage in den Sinn:
Ich konnte es leider nicht testen, weil ich bei der Zeitumstellung nicht dran gedacht habe und im Bett war :-)

Wie verhält sich denn Delphi bei der Zeitumstellung? Also wenn ich z.b. einen String in ein TDateTime umwandeln will und ich einen Zeitpunkt habe, den es nicht gibt, weil es ihn 2 Mal oder gar nicht gibt?
Wo sind denn die typischen Stolpersteine und wie kann ich die umschiffen?

Danke,
Matze


Yogu - Mo 30.03.09 20:58

user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
Ich konnte es leider nicht testen, weil ich bei der Zeitumstellung nicht dran gedacht habe und im Bett war :-)

Dann schalte doch mal die Synchronisierung aus und stell das Datum auf den 28. März :idea: ;)

user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
Wie verhält sich denn Delphi bei der Zeitumstellung? Also wenn ich z.b. einen String in ein TDateTime umwandeln will und ich einen Zeitpunkt habe, den es nicht gibt, weil es ihn 2 Mal oder gar nicht gibt?

TDateTime rechnet IMHO mit der Greenwich Meantime, die keine Sommerzeit besitzt. Ich hab mich das auch schonmal gefragt, nur um dann auf diese Lösung zu kommen. Aber sicher bin ich mir da nicht. :nixweiss:


GTA-Place - Mo 30.03.09 20:58

Du meinst also, was passiert, wenn man den 29.03.2009 02:30 umwandeln möchte? Nichts :mrgreen:


Yogu - Mo 30.03.09 21:09

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
Du meinst also, was passiert, wenn man den 29.03.2009 02:30 umwandeln möchte?

Ach, jetzt hab ich das verstanden. Genau, ich hab mich damals gefragt, was passiert, wenn man zu einem UNIX-Timestamp eine halbe Stunde dazuzählt und damit geradewegs in der "verbotenen Zone" landet. Aber von String zu Zeitstempel ist das durchaus ein Problem.

Hm, ich hab das mal ausprobiert:


Delphi-Quelltext
1:
2:
ShowMessage(FloatToStr(Double(StrToDateTime('29.03.2009 01:30')))); // 39901,0625
ShowMessage(FloatToStr(Double(StrToDateTime('29.03.2009 02:30')))); // 39901,1051666667

Oder gibts da schon wieder keine Sommerzeit? Wie dem auch sei - ich hab jetzt keine SommerZeit das genauer zu untersuchen ;)


BenBE - Di 31.03.09 12:10

Normal unterscheidet man im Amtsdeutsch da zwischen 2:30 A und 2:30 B. Was da nun UTC+1 (Winterzeit) und was UTC+2 (Sommerzeit) angegeben hat, müsste ich nachgucken. Hab da zu hause nen Link zu.

Wie das aber Delphi intern behandelt und OB Delphi mit der A\B-Angabe überhaupt was macht: Ich glaubs nicht ;-)


matze - Do 02.04.09 08:50

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Dann schalte doch mal die Synchronisierung aus und stell das Datum auf den 28. März :idea: ;)

Hmmm... vermutlich werde ich genau das mal machen.
Also hat hier noch niemand damit groß Probleme gehabt oder Erfahrungswerte gesammelt.
Wenn ich dann mal dazu komme, das zu Testen, schreib ich euch hier meine Ergebnisse!


delfiphan - Do 02.04.09 17:59

Delphi berücksichtigt Sommerzeit/Winterzeit nicht speziell. Gewisse TDateTime Werte werden also effektiv nie angenommen bzw. kommen doppelt vor. Somit wäre im Oktober TDateTime("2:30 A") = TDateTime("2:30 B"). Anders ausgedrückt: Delphi rechnet immer mit 24h-Tagen, egal ob sie effektiv 23h oder 25h lang waren.

Wenn du 29.03.2009 02:30 umwandelst, bekommst du als Nachkommawert wie an jedem anderen Tag auch 2.5/24.

Das ist auch gut so, sonst würde DateTimeToStr nach der Zeitänderung plötzlich andere Werte anzeigen für TDateTime Werte vom Vortag - oder man müsste die Zeitzone mit TDateTime mitspeichern, was nicht der Fall ist.