Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Beitragvon Martin V » 7. Sep 2018, 10:02 Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Wenn ich sysutils.findfirst verwende, erhalte ich bei der Abfrage von tSearchrec.time, wenn ich sie unpacke, bei MacOS wirre Datumsangaben (2025, 31 Uhr). Unter Windows geht es. Ich habe auf die aktuelle Freepascal/Lazarus Version upgegradet. Kennt jemand dieses Problem?
Martin V
 
Beiträge: 122
Registriert: 30. Jan 2010, 19:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon MacWomble » 7. Sep 2018, 13:53 Re: Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Ist doch klar, wenn die Sommerzeit in zwei Jahren abgeschafft wird, also 2020, dann verschiebt sich die Zeit ja jedes Jahr um 1 Stunde. Das macht schon mal 5 Stunden, womit der Tag sich von heute 24 Stunden +5 auf 29 Stunden verlängert. Dann haben wir ja ohnehin noch zwei Stunden Zeitverschiebung - et voila:

Im Jahr 2025 ist 31 Uhr durchaus möglich. 8)

Warum die bei Linux und MS das noch nicht implementiert haben, ist allerdings auch mir ein Rätsel

:shock: :D :D

PS: Sorry :oops:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 591
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Warf » 7. Sep 2018, 16:44 Re: Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Da müsste man mal an sich schauen wie findfirst für OSX implementiert ist. An sich müsste das ja auf die selben POSIX Funktionen wie unter Linux zurückgreifen. Ich geh einfach mal davon aus das die OSX implementiereung "vergisst" stat aufzurufen für die zusätzlichen Informationen wie zeit zu erhalten (im Gegensatz zur windows API gibt die readdir Funktion nicht die Dateizeit zurück). Mach doch ein {$IFDEF UNIX} mit der Funktion stat.
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Martin V » 8. Sep 2018, 22:43 Re: Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Inzwischen habe ich das Programm auch unter Linux 64 bit compiliert, auch hier verhält es sich so wie bei MacOS. Es ist also Unix-spezifisch. Das kann doch nicht sein, dass noch keiner solch einen Fehler bemerkt hat? Gibt es noch eine Alternative zu sysutils.findfirst und Konsorten?
Martin V
 
Beiträge: 122
Registriert: 30. Jan 2010, 19:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 8. Sep 2018, 23:13 Re: Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Martin V hat geschrieben:Wenn ich sysutils.findfirst verwende, erhalte ich bei der Abfrage von tSearchrec.time, wenn ich sie unpacke, bei MacOS wirre Datumsangaben (2025, 31 Uhr). Unter Windows geht es. Ich habe auf die aktuelle Freepascal/Lazarus Version upgegradet. Kennt jemand dieses Problem?

Was machst du konkret?

Folgendes zeigt bei mir (Mint, Laz trunk) die aktuelle Zeit an:
Code: Alles auswählen
uses
  DateUtils;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Info: TSearchRec;
  t: TDateTime;
  s: String;
  ft: LongInt;
begin
  If FindFirst ('*',faAnyFile and faDirectory,Info)=0 then
  begin
    Repeat
      With Info do
        s := Format('%s - %s', [
          Info.Name,
          FormatDateTime('dd.mm.yyyy hh:nn', UniversalTimeToLocal(UnixToDateTime(Info.Time)))
      ]);
      Memo1.Lines.Add(s);
    Until FindNext(info)<>0;
  end;
  FindClose(Info);
end;
wp_xyz
 
Beiträge: 2641
Registriert: 8. Apr 2011, 08:01

Beitragvon Martin V » 9. Sep 2018, 11:13 Re: Unix sysutils.findfirst falsches Datum 2025 31 Uhr

Danke für den richtigen Hinweis. Ich habe jetzt herausgefunden, dass das interne longint Zeitformat aus dem tSearchRec bei Windows und Unix verschieden ist. PackTime und UnpackTime darf man nur bei Windows verwenden, bei Unix muss man stattdessen UnixDateToDT und DTtoUnixDate verwenden. In der Doku steht zwar, man soll die Funktionen nicht direkt aufrufen, aber die generelle plattformunabhängige Prozedur dafür habe ich nicht gefunden.
Martin V
 
Beiträge: 122
Registriert: 30. Jan 2010, 19:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

porpoises-institution
accuracy-worried