Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FileAge Sommer/Winterzeit Uhrzeit falsch (https://www.delphipraxis.net/202472-fileage-sommer-winterzeit-uhrzeit-falsch.html)

stalkingwolf 7. Nov 2019 13:53

Delphi-Version: XE4

FileAge Sommer/Winterzeit Uhrzeit falsch
 
Wenn man per fileage die Uhrzeit von einer Datei aufruft, welche zur Sommerzeit angelegt wurde, dann wird in der Winterzeit die falsche Uhrzeit ausgegeben.
D.h eine Datei von 8:00 wird mit fileage 7:00 angezeigt.
Zuerst dachte ich es würde an dem filage liegen welches deprecated ist, aber mit dem neuen passiert dies auch.
Code:
FileAge(filename,filedatetime,false);
Im Explorer wird alles korrekt angezeigt.

Idee woran das liegt oder wie man das umgeht?
Ich habe im Netz etwas von Daylight Saving Time gefunden. D.h man müsste ich selber darum kümmern?

Uwe Raabe 7. Nov 2019 14:10

AW: FileAge Sommer/Winterzeit Uhrzeit falsch
 
Nimm besser
Delphi-Quellcode:
TFile.GetLastWriteTime
aus System.IoUtils.pas.

stalkingwolf 7. Nov 2019 14:50

AW: FileAge Sommer/Winterzeit Uhrzeit falsch
 
Danke für den Tipp. Gibt allerdings genauso falsch die Zeit wieder.
Oder ist der Fehler eher in formatdatetime oder datetimetostr beim darstellen der Uhrzeit?

Uwe Raabe 7. Nov 2019 15:32

AW: FileAge Sommer/Winterzeit Uhrzeit falsch
 
Zitat:

Zitat von stalkingwolf (Beitrag 1450956)
Gibt allerdings genauso falsch die Zeit wieder.

Also hier bekomme ich für eine Datei im Explorer 24.06.2019 16:55 angezeigt.

Mit
Delphi-Quellcode:
DateTimeToStr(FileDateToDateTime(FileAge(cFileName)))
bekomme ich 24.06.2019 15:55 und
mit
Delphi-Quellcode:
DateTimeToStr(TFile.GetLastWriteTime(cFileName))
liefert er 24.06.2019 16:55

samso 8. Nov 2019 06:14

AW: FileAge Sommer/Winterzeit Uhrzeit falsch
 
Ich bin der Meinung, dass das schon immer problematisch war. Das NT-Filesystem speichert intern UTC. Die lokale Zeit muss dann berechnet werden.

Um also zur korrekten lokalen Zeit zu kommen, muss zunächst der Offset zwischen UTC und lokaler Zeit zum Zeitpunkt des Zeitstempels berechnet werden (und an dieser Stelle darf man gerne eine Tabelle für alle Änderungen der Sommerzeitregelung der letzten xxx Jahre anlegen - natürlich unter Berücksichtigung des jeweiligen Landes).
Als weitere Schwierigkeit kommt hinzu, dass bei anderen Dateisystemen (z.B. FAT32 bei USB Sticks etwa) die lokale Zeit (also nicht UTC) gespeichert wird. Deshalb kann die lokale Zeit dort unproblematisch ermittelt werden. Dafür kommt man aber nicht mehr sauber zu UTC zurück (wegen der doppelten Stunde bei der Zeitumstellung).

Die Ursache des Problems ist bei den verwendeten Funktionen zu suchen die den Zeitstempel ermitteln und aus dem Zeitstempel dann die jeweils andere Zeit berechnen. Die Umwandlung der Zeit in einen String ist nicht das Problem.

samso 8. Nov 2019 07:18

AW: FileAge Sommer/Winterzeit Uhrzeit falsch
 
Zitat:

Zitat von stalkingwolf (Beitrag 1450952)
Im Explorer wird alles korrekt angezeigt.

Bei Windows XP konnte der Explorer das auch noch nicht. Damals wäre Dir der Fehler eventuell also nicht aufgefallen.

Meine Delphi-IDE (10.1) stolpert übrigens auch über dieses Problem. Wenn während der Zeitumstellung die IDE geöffnet bleibt, dann glaubt sie danach, dass sich alle offenen Dateien geändert hätten.

p80286 8. Nov 2019 09:39

AW: FileAge Sommer/Winterzeit Uhrzeit falsch
 
Da weiß man seit Jahren, daß Oberfläche und Daten getrennt gehören, aber konsequente Umsetzung warum das denn. Wenn ich in die Delphi-Referenz schaue und alle Funktionen durch habe, die sich mit der "Filetime" beschäftigen, dann weiß ich auch erst was die einzelnen Funktionen können, bzw. nicht können. Und jetzt kommt mir nichtmit historischen Altlasten. Das zumindest sollte dann auch explizit drin stehen.

Gruß
k-H


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