Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zeitzonenproblem (https://www.delphipraxis.net/188488-zeitzonenproblem.html)

Peter666 9. Mär 2016 10:26

Zeitzonenproblem
 
Hi,

ich hab hier ein Problem mit dem Verständnis:

Delphi-Quellcode:
var
  utctime: TDateTime;
begin
  utctime := EncodeDateTime(2016, 03, 27, 02, 30, 00, 00);
  caption := dateTimeToStr(TTimeZone.Local.ToUniversalTime(utctime));
end;
Ich bekomme eine Exception, da zu dem Zeitpunkt ja Sommerzeit ist. Was muss ich machen, damit die Exception nicht kommt und die korrekte Sommerzeit für den Versatz benutzt wird?

vorher hab ich das wie folgt gemacht und da ging das:

Delphi-Quellcode:
function UTCToLocalTime(UTC: TDateTime): TDateTime;
var
  UTCTime, LocalTime: TSystemTime;
begin
  DatetimetoSystemTime(UTC, UTCTime);
  SystemTimeToTzSpecificLocalTime(@TimeZoneInf, UTCTime, LocalTime);
  result := SystemTimeToDateTime(LocalTime)
end;
Peter

berens 9. Mär 2016 12:28

AW: Zeitzonenproblem
 
Welche Delphi-Version verwendest Du und welche Unit wird benötigt, um TTimeZone verwenden zu können? Ich habe auf die Schnelle nur "SqlTimSt" als Unit gefunden, und da ist TTimeZone ein Record...

Generell würde ich sagen: Du versuchst über TTimeZone auf eine KLASSE und nicht auf ein instanziertes Objekt zuzugreifen. Zwar könnte auch die Klasse TTimeZone dir ein gültiges Objekt "Local" zurückgeben, würde mich aber zunächst wundern.

Das ich den Quelltext mangels Unit für TTimeZone nicht nachstellen kann: Was passiert, wenn Du eine Variable tmp: TTimeZone erstellst und diese mit tmp := TTimeZone.Create instanzierst? Kannst du dann tmp.local auslesen?

bra 9. Mär 2016 13:09

AW: Zeitzonenproblem
 
Der Aufruf von TTimeZone.Local ist schon so in Ordnung. Die kommen aus DateUtils, aber wohl erst in neueren Versionen, XE+?

Was für eine Exception bekommst du denn?

Und die Bezeichnung der Variable ist ein wenig verwirrend, utctime ist tatsächlich ja eine lokale Zeit und im Edit soll die UTC-Zeit ausgegeben werden, oder?

Auch macht deine Beispielfunktion UTCToLocalTime ja genau das Gegenteil. Wenn du eine UTC-Zeit in Lokal umwandeln willst, muss TTimeZone.Local.ToLocalTime verwendet werden.

Bambini 9. Mär 2016 13:13

AW: Zeitzonenproblem
 
Zitat:

Zitat von bra (Beitrag 1332447)
Der Aufruf von TTimeZone.Local ist schon so in Ordnung. Die kommen aus DateUtils, aber wohl erst in neueren Versionen, XE8?

Den 27.03.2016 02:30 Uhr gibt es nicht. Da die Uhrzeit in dieser Nacht von 02:00 -> 03:00 Uhr vorgestellt wird.
Man kann diese nicht "vorhandene" oder "doppelte" Stunde mit IsInvalidTime() bzw. IsAmbiguousTime() prüfen lassen,
dann zuvor eine Stunde addieren, konvertieren und danach wieder abziehen.

bra 9. Mär 2016 13:38

AW: Zeitzonenproblem
 
Uff, da muss man erstmal drauf kommen ;)

Bambini 9. Mär 2016 20:58

AW: Zeitzonenproblem
 
Zitat:

Zitat von bra (Beitrag 1332451)
Uff, da muss man erstmal drauf kommen ;)

Warum Delphi das bei der Konvertierung auch unbedingt prüfen muss ... hat wohl Gründe die wir noch nicht kennen.

bra 10. Mär 2016 08:48

AW: Zeitzonenproblem
 
Zitat:

Zitat von Bambini (Beitrag 1332512)
Warum Delphi das bei der Konvertierung auch unbedingt prüfen muss ... hat wohl Gründe die wir noch nicht kennen.

Naja, eigentlich ist es korrekt. Bringt ja nichts mit einer Uhrzeit zu arbeiten, welche es eigentlich nicht geben dürfte. Man kann ja auch nicht einfach annehmen, dass der 29.2. jedes Jahr existiert ;)

Sir Rufo 10. Mär 2016 11:30

AW: Zeitzonenproblem
 
Wenn man einen Zeitwert in UTC hat und den dann mit
Delphi-Quellcode:
TTimeZone.Local.ToUniversalTime( utctime );
in ... ja in was will man diese UTC-Zeitangabe (?) denn konvertieren?

Der Methode
Delphi-Quellcode:
TTimeZone.Local.ToUniversalTime()
muss ein gültiger, lokaler DateTime-Wert übergeben werden. Wenn nicht gibt es eine Exception.

Wenn ich die Bezeichnung utctime lese, dann gehe ich aber mal davon aus, dass hier eben kein lokaler DateTime-Wert vorliegt (ungültig ist der hier auf jeden Fall).


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 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