AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
Zitat:
|
AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
Wie gesagt, es wäre auch nicht mein bevorzugter Weg die Uhrzeit auf dem Rechner zu synchronisieren. Ich dachte mir auch schon, dass dies sicherlich aus Berechtigungsgründen nicht geht.
Ich gebe jetzt mal noch zusätzlich in meinem Output TTimeZone.Local.ToUniversalTime(...) aus, damit ich ausschließe, dass es hier ein falsches Setting auf den einzelnen Rechnern/Tablets gibt. |
AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
Man muß auch nicht unbedingt direkt die Uhr ändern.
Bei uns wird die Serverzeit abgefragt und mit der lokalen Zeit die Differenz gebildet. (beim Start und regelmäßig zwischendrin, während der Connectionchecks, wegen der Schaltjahre, Schaltsekunden und sonstwas) Die meisten Operationen laufen in der Datenbank ab, also mit der Serverzeit, wellche sich selbst über einen Timeserver updated (current_time im SELECT/INSERT/UPDATE, anstatt Now über Parameter), aber für Anzeigen im Programm, welche z.B. lokal über Now bestimmt wurden, da wird dann einfach diese Differenz hinzugerechnet, damit das mit der Serverzeit in etwa übereinstimmt, egal was die Uhr im Rechner sagt. |
AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
Ja, genau dies mache ich ja in meiner App genauso. Das Problem ist ja nur, dass ich mich darauf verlassen muss, dass ich auf jedem Device die Differenz zur gleichen Basis bilden kann. Und genau dies scheint bei TIdTime nicht der Fall zu sein, es klappt nur bei Windows so wie beschrieben. Ich würde mich ja auch noch zu Code hinreißen lassen, wo ich dann für MacOS, iOS und Android eine andere Basis (UTC) benutze. Aber wie man am Beispiel meines Amazon FireHD-Tablets sieht, ist die Differenz dort nochmals komplett eine andere.
|
AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
So ich habe mich jetzt mal durch Indy-debuggt, der Fehler passierte inIdGlobalProtocols.TimeZoneBias:
Delphi-Quellcode:
Keine Ahnung, warum die so kompliziert implementiert ist, ich habe es mal mit folgendem Code ersetzt:
function TimeZoneBias: TDateTime;
{$IFNDEF FPC} {$IFDEF UNIX} var T: Time_T; TV: TimeVal; UT: {$IFDEF USE_VCL_POSIX}tm{$ELSE}TUnixTime{$ENDIF}; {$ELSE} {$IFDEF USE_INLINE} inline; {$ENDIF} {$ENDIF} {$ELSE} {$IFDEF USE_INLINE} inline; {$ENDIF} {$ENDIF} begin {$IFNDEF FPC} {$IFDEF UNIX} {from http://edn.embarcadero.com/article/27890 } gettimeofday(TV, nil); T := TV.tv_sec; localtime_r({$IFNDEF USE_VCL_POSIX}@{$ENDIF}T, UT); // __tm_gmtoff is the bias in seconds from the UTC to the current time. // so I multiply by -1 to compensate for this. Result := (UT.{$IFNDEF USE_VCL_POSIX}__tm_gmtoff{$ELSE}tm_gmtoff{$ENDIF} / 60 / 60 / 24); {$ELSE} ...
Delphi-Quellcode:
Zumindest für Google-Android und iOS funktioniert es jetzt. Für Amazon-FireOS-Android scheint es noch ein weiteres Problem zu geben, dies ignoriere ich jetzt mal und setze die Differenz auf 0.0s.
function TimeZoneBias: TDateTime;
{$IFNDEF FPC} {$IFDEF UNIX} var nowDt:TDateTime; {$ELSE} {$IFDEF USE_INLINE} inline; {$ENDIF} {$ENDIF} {$ELSE} {$IFDEF USE_INLINE} inline; {$ENDIF} {$ENDIF} begin {$IFNDEF FPC} {$IFDEF UNIX} nowDt:=NOW; Result := TTimeZone.Local.ToUniversalTime(nowDt)-nowDt; {$ELSE} ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 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