DateUtils: Sommerzeit-Umschaltung funktioniert nicht. Warum?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

DateUtils: Sommerzeit-Umschaltung funktioniert nicht. Warum?

Beitrag von Timm Thaler »

Ich habs schonmal im englischen Forum versucht, aber das Ergebnis war nicht so zufriedenstellend: http://forum.lazarus.freepascal.org/ind ... #msg241984

Ich habe einige Lazarus-Programme auf dem Raspberry unter Jessie laufen. Die schreiben Ereignisse mit Zeitstempel in Logfiles.

Vor einigen Tagen war nun Zeitumstellung. Die Zeit der Raspi-Uhr wurde richtig umgestellt, wie ich mit "date" in der Konsole auch überprüfen konnte. Die Programme haben aber immer noch die "alte" Zeit geloggt, mit einer Stunde Unterschied.

Erst nach Anhalten und Neustart haben die Programme dann die richtige Zeit geloggt. Das sah dann so aus:

26.03.17 18:41:50 - Beende HC Data
26.03.17 19:41:53 - Starte HC Data <= Neustart nach 3 Sekunden


Ich frage die Zeit mit "Now" ab und formatiere sie mit FormatDateTime.

Code: Alles auswählen

FormatDateTime('dd.mm.yy hh:nn:ss', Now)


Wenn ich die Beiträge richtig verstanden habe, liegt es daran, dass die Zeitzonen-Einstellung nur bei Programmstart abgefragt wird, und "Now" dann immer diese Einstellung verwendet. Man müsste regelmäßig "GetLocalTimezone" aufrufen, um eine Aktualisierung zu erzwingen (http://forum.lazarus.freepascal.org/ind ... 970.0.html).

Warum ist das so umständlich? Warum wird nicht einfach die Systemzeit abgefragt, wie sie auch "date" in der Konsole liefert?

Ist die Lösung mit "GetLocalTimezone" korrekt, oder gibt es noch eine bessere Lösung, bei dauernd laufenden Programmen richtig auf die Zeitumstellung zu reagieren?

Sollte sowas nicht in der Hilfe erwähnt werden? Das merkt man doch bestenfalls durch Zufall, und dann hat man vielleicht monatelang falsche Daten geloggt.

Im englischen Forum scheint das Thema nicht so interessant zu sein. Ist halt so, nimmt man hin.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: DateUtils: Sommerzeit-Umschaltung funktioniert nicht. Wa

Beitrag von mse »

nowlocal() von MSEgui benutzt sys_getlocaltime() welches die Umstellung automatisch in sys_localtimeoffset() vornimmt . Der Code ist hier:
https://gitlab.com/mseide-msegui/mseide ... ysintf.pas

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: DateUtils: Sommerzeit-Umschaltung funktioniert nicht. Wa

Beitrag von Timm Thaler »

Ich muss das nochmal rauskramen:

Ich habe jetzt versucht, entsprechend diversen Tipps aus dem englischen Forum mit

Code: Alles auswählen

      ReadTimezoneFile(GetTimezoneFile);
      GetLocalTimezone(0);    // Zeitzone neu einlesen für Sommer/Winterzeit-Umschaltung

eine regelmäßige Aktualisierung der Zeitzone / Sommerzeit zu erzwingen. Mit dem Effekt, dass er jetzt immer Winterzeit liefert. ;-)

Wahrscheinlich ist der Timer bei https://www.freepascal.org/docs-html/rtl/unix/getlocaltimezone.html falsch, aber welchen Timer muss man denn da einsetzen? fptime wie im Beispiel funktioniert schonmal nicht. Einen eigenen Timer habe ich nicht. Es müsste ja ein von Now verwendeter Timer sein, aber wo bekomme ich den her. Ich steh da gerade auf dem Schlauch...

Hab jetzt noch ReReadLocalTime https://www.freepascal.org/docs-html/rtl/unix/rereadlocaltime.html gefunden, wäre das hier angebrachter? Witzigerweise erst jetzt, obwohl ich zu dem Thema schon mehrere Googlesessions hatte.

Antworten