Es ist egal, mit welchem Programm oder auf welchem
OS-System die ZIP-Datei erstellt wurde, TZIP-File gibt immer das falsche Datum und Uhrzeit zurück.
Zip-Dateien, die mit TZipl-File erstellt werden, werden aber von anderen Programmen richtig anzeigt (aber TZipfile zeigt die selbst erstellten auch falsch an).
Also ist es ein Ausleseproblem. Da kommen einige Ansatzpunkte in Betracht:
ModifiedDateTime ist als UNIT32 im TZipheader definiert:
Delphi-Quellcode:
TZipHeader = packed record
MadeByVersion: UInt16; // Start of Central Header
RequiredVersion: UInt16; // Start of Local Header
Flag: UInt16;
CompressionMethod: UInt16;
ModifiedDateTime: UInt32;
CRC32: UInt32;
Daher war eine erste Annahme, ob es etwas mit Integer-Problemen zu tun haben könnte, da auf den unterschiedlichen Plattformen einige Integertypen unterschiedliche Anzahl Bytes haben.
In der Procedure TZipFile.REadCentralHeader wird es dann so ausgelesen:
VerifyRead(FStream, LHeader.ModifiedDateTime, Sizeof(UInt32));
Ich habe nun festgestellt, dass auf allen Plattformen
Zipfile.FileInfo[c].ModifiedDateTime
den gleichen Wert zurückliefert, nur FileDateToDateTime liefert aber offenbar unterschiedliche Ergebnisse zurück.
Für Linux / MAC ist FileDatetoDateTime wie wolgt definiert:
Delphi-Quellcode:
function FileDateToDateTime(FileDate: LongInt): TDateTime;
var
TempFileDate: time_t;
UT: tm;
begin
TempFileDate := FileDate;
localtime_r(TempFileDate, UT);
Result := EncodeDate(UT.tm_year + 1900, UT.tm_mon + 1, UT.tm_mday) +
EncodeTime(UT.tm_hour, UT.tm_min, UT.tm_sec, 0);
end;