Windows & Linux Unabhängig Filetime als GMT String

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Windows & Linux Unabhängig Filetime als GMT String

Beitrag von Heinrich Wolf »

Hallo gocher,

ich hab noch mal im Detail getestet und kann bestätigen, dass nicht alles passt. Aber es ist das Verhalten von Windows, das mir nicht gefällt und das man leider als gegeben hinnehmen muss. Bei einer unveränderten Datei bewirkt das Umstellen der Systemuhr um ein halbes Jahr, dass sich die Anzeige des Zeitstempels im Windows Explorer um 1 Stunde verändert! Das sehe ich als groben Fehler von Windows an. :( Mit dieser Erkenntnis kann man alle Umrechnungsversuche von Zeitstempeln, z.B. mit Deiner LocalTimeToGMTTime() vergessen und bei dem Code bleiben, den Du am 6.6. um 22:46 gepostet hast. Für Zeitstempel aus anderen Quellen sehe ich Dein LocalTimeToGMTTime() aber nun als korrekt an.

Heiner
Zuletzt geändert von Heinrich Wolf am So 10. Jun 2012, 20:36, insgesamt 2-mal geändert.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Windows & Linux Unabhängig Filetime als GMT String

Beitrag von Heinrich Wolf »

Hallo,

meine neueste Erkenntnis: Es geht ohne $ifdef, ohne viele Umrechnungen und ohne LibC in Windows und Unix einfach mit

Code: Alles auswählen

function FileTimeGMT(Dateiname : String) : tDateTime;
Heiner

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Windows & Linux Unabhängig Filetime als GMT String

Beitrag von gocher »

Heinrich Wolf hat geschrieben:Hallo,

meine neueste Erkenntnis: Es geht ohne $ifdef, ohne viele Umrechnungen und ohne LibC in Windows und Unix einfach mit

Code: Alles auswählen

function FileTimeGMT(Dateiname : String) : tDateTime;
Heiner
Meinst Du die Funktion aus libtar, die ist die nicht nur für tar-Archive? Nein :D !!!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Windows & Linux Unabhängig Filetime als GMT String

Beitrag von Heinrich Wolf »

gocher hat geschrieben:Meinst Du die Funktion aus libtar, die ist die nicht nur für tar-Archive? Nein :D !!!
Genau! Die Funktion aus libtar.

Heiner

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Windows & Linux Unabhängig Filetime als GMT String

Beitrag von gocher »

So nun noch mal die drei Funktionen zur Ausgabe von GMT-Strings, funktionstüchtig ab Windows XP.

Im uses Abschnitt muss libtar hinzugefügt werden!

Code: Alles auswählen

const
  tsRFC = 'ddd, dd mmm yyyy  hh:nn:ss "GMT"';
  tsISO = 'yyyy"-"mm"-"dd"T"hh":"nn":"ss"+00:00"';
 
 
function FileTimeToGMT(const AFilename: string; const frmtstr: string = tsRFC): string;
var
  fs: TFormatSettings;
  dt: TDateTime;
begin
  dt := FileTimeGMT(AFilename);
  fs := DefaultFormatSettings;
  result := FormatDateTime(frmtstr, dt, fs);
end;
 
function NowToGMT(const frmtstr: string = tsRFC): string;
var
  fs: TFormatSettings;
  SystemTime: TSystemTime;
  dt: TDateTime;
begin
//  result := DateTimeToGMT(Now(), frmtstr); 
  fs := DefaultFormatSettings;
  GetSystemTime(SystemTime);
  dt := SystemTimeToDateTime(SystemTime);
  result := FormatDateTime(frmtstr, dt, fs);
end;
 
function TzSpecificLocalTimeToSystemTime(
  lpTimeZoneInformation: PTimeZoneInformation;
  lpLocalTime, lpUniversalTime: PSystemTime): BOOL; stdcall; external 'kernel32.dll';
 
function DateTimeToGMT(const ALocalTime: TDateTime; const frmtstr: string = tsRFC): string;
var
  fs: TFormatSettings;
  TZInfo: TTimeZoneInformation;
  LocalTime, SystemTime: TSystemTime;
  dt: TDateTime;
begin
  fs := DefaultFormatSettings;
  GetTimeZoneInformation(TZInfo);
  DateTimeToSystemTime(ALocalTime, LocalTime);
  TZSpecificLocalTimeToSystemTime(@TZInfo, @LocalTime, @SystemTime);
  dt := SystemTimeToDateTime(SystemTime);
  result := FormatDateTime(frmtstr, dt, fs);
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Windows & Linux Unabhängig Filetime als GMT String

Beitrag von Heinrich Wolf »

Ich hab nochmal mit Windows und Linux Zeitstempeln gespielt: Zeitzone umgestellt, Monat umgestellt. Windows passt den angezeigten Zeitstempel nicht an, wenn die Zeitzone umgestellt wird. Auch dadurch springt der GMT Zeitstempel bei unangetasteter Datei. Mit Linux bin ich sehr zufrieden, zumindest mit einem C Programm, das ich auf Basis von stat() und gmtime() geschrieben habe. Allerdings kriegt das Lazarus Programm mit FileTimeGMT() aus unerfindlichen Gründen die Umstellung der Zeitzone nicht mit. Es ist, als wäre die Zeitzone mit eincompiliert. Keine Ahnung, was da läuft. Jedenfalls springt bei Umstellung der Zeitzone der angezeigte GMT Zeitstempel im Lazarus Programm.

Heiner

Antworten