Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Differenz zur echten Uhrzeit in Sekunden ermitteln (https://www.delphipraxis.net/206662-differenz-zur-echten-uhrzeit-sekunden-ermitteln.html)

philipp.hofmann 15. Jan 2021 22:39

Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Hi,

ich versuche mit TIdTime die Differenz zur wirklichen, aktuellen Uhrzeit ermitteln.
Dafür will ich TIdTime nutzen:

Ich ziehe mir die aktuelle Uhrzeit auf dem Rechner und die aktuelle Uhrzeit von TIdTime.
Jetzt habe ich auf einem iOS und einem Android-Device rund 2 Stunden-Unterschied, d.h. läuft noch irgendwas mit den Zeitzonen falsch.
Auf einem Rechner, der bei manueller Prüfung auf die Sekunde die gleiche Uhrzeit wie ein anderer hat, bekomme ich 30 Sekunden Unterschied raus.

Was mache ich hier falsch? Muss man andere TIdTime-Methoden nutzen? Ich würde ungerne die Systemzeit selbst durch diesen Check anpassen.

Delphi-Quellcode:
procedure TicTrainerF.syncTime();
var idTime:TIdTime;
    dtLocal,dtServer:TDateTime;
    msDiff:Int64;
begin
  idTime:=TIdTime.create(nil);
  try
    idTime.Host:='time.nist.gov';
    dtServer:=idTime.dateTime;
    if (dtServer>0) then
    begin
      dtLocal:=NOW;
      msDiff:=MillisecondsBetween(dtServer,dtLocal);
      if (dtLocal>dtServer) then
        syncTimeDiff:=msDiff*-1
      else
        syncTimeDiff:=msDiff;
      mlog.info('syncTime '+FloatToStrF(syncTimeDiff/1000,ffFixed,8,3,myFormatSettings)+'s');
    end else begin
      mlog.info('syncTime not possible²');
      syncTimeDiff:=0;
    end;
  finally
    hideHourGlass();
    idTime.free;
  end;
  except on E: Exception do
    begin
      mlog.info('syncTime not possible');
      syncTimeDiff:=0;
    end;
  end;
end;
Grüße, Philipp

Rollo62 16. Jan 2021 10:52

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Kenne mich mit TimeServern nicht so aus, aber kann es sein das man die Timezone bei der Anfrage mit angeben muss ?
Ich würde normalerweise UTC vermuten, die 2h deuten ja etwas darauf hin.
Schau doch mal was TIdTime wirklich macht.

philipp.hofmann 16. Jan 2021 12:11

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Rein von der Doku her muss man keine Zeitzone mitgeben und bei meinen beiden Windows-Möhren geht es auch so, nur unter Android und iOS passiert etwas anderes:

TIdTime.DateTime:
  • DateTime is a read-only TDateTime property that reflects the estimated current date and time according to a Time server.
    DateTime is expressed in the timezone for the local computer.

TIdTime.SyncTime:
  • Updates local time to match the Time server.
    das wäre die Alternative, aber ob ich aus einer App die "local time" anpassen will, ich weiß nicht.

Werde ich wahrscheinlich mal den Indy-Code anschauen müssen.

venice2 16. Jan 2021 16:13

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Zitat:

Zitat von Rollo62 (Beitrag 1481042)
Ich würde normalerweise UTC vermuten, die 2h deuten ja etwas darauf hin.

Ich auch.
Hatte das gleiche Problem letztens mit meinem Video Player.

shebang 16. Jan 2021 17:12

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1481046)
Rein von der Doku her muss man keine Zeitzone mitgeben und bei meinen beiden Windows-Möhren geht es auch so, nur unter Android und iOS passiert etwas anderes

Ist denn auf den beiden Mobilgeräten die Zeitzone auch korrekt eingestellt?

philipp.hofmann 16. Jan 2021 18:08

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Ja, die Zeitzone stimmt auf den Geräten. Ich habe auch schon überlegt als Zeitdifferenz nur
Delphi-Quellcode:
msDiff:=MillisecondsBetween(dtServer,dtLocal) mod 3600000;
zu nehmen, aber wie gesagt, dann kommen bei einem Device 30 Sekunden Differenz raus, obwohl die Uhrzeit ziemlich genau die gleiche ist (maximal +/- 1 Sekunde). Da baue ich mal noch ein paar mehr Loggings ein, vielleicht braucht er auch so lange um den Time-Server abzufragen, dann wäre es eh unbrauchbar für die Differenzen auf Sekundenebene einzustellen.

Das es wohl bei 2 Stunden UTC sein sollte, ist mir klar, weiß ich aber ja auch nur, weil ich es hier bei mir in Deutschland aufrufe. Mir ist noch unklar, wie ich daraus eine allgemein gültige Regel machen sollte, da es bei meinen Windows-Geräten stimmt. Einem TDateTime sieht man ja die Zeitzone nicht an.

TurboMagic 17. Jan 2021 15:57

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Hallo,

falls du hier keine weiterführenden ANtworten bekommnst könntest du mal in der EN DP posten (ich vermute du kannst Englisch),
da liest m.w. zumindest einer der Indy Entwickler mit!

Grüße
TurboMagic

Rollo62 18. Jan 2021 07:07

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Vielleicht ist das die Lösung ?
https://stackoverflow.com/questions/...-via-all-hosts

philipp.hofmann 18. Jan 2021 17:35

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Danke für den Tipp mit dem englischen DP. Habe ich mal gemacht.
Anbei mal meine aktuellen Testergebnisse (MacOS fehlt noch), wie man sieht springt insbesondere Android auf einem Amazon-Tablet (FireHD 10) komplett aus der Reihe, da stimmt jetzt mal gar nichts.
Vorne sieht man immer die Uhrzeit vor und nach der Abfrage und danach das Ergebnis der Abfrage:

incorrect (timezone):
---------------------
syncTime (Android): 2021-01-18 16:24:50.789-16:24:51.169 vs 2021-01-18 14:24:51.000
syncTime (Android): 2021-01-18 16:24:48.071-16:24:48.428 vs 2021-01-18 14:24:49.000
syncTime (iOS): 2021-01-18 16:24:49.658-16:24:49.996 vs 2021-01-18 14:24:50.000

incorrect (at all):
-------------------
syncTime (FireOS/Android): 2021-01-18 16:24:48.606-16:24:49.028 vs 2021-01-18 14:40:02.000

correct:
--------
syncTime (Windows): 2021-01-18 16:24:47.612-16:24:48.359 vs 2021-01-18 16:24:48.000
syncTime (Windows): 2021-01-18 16:24:46.014-16:24:46.771 vs 2021-01-18 16:24:47.000

Rollo62 19. Jan 2021 07:17

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln
 
Hallo Phillip,

womit hast Du denn vorher Alles getestet, auch hiermit ?
(TTimeZone.Local.ToLocalTime, TTimeZone.Local.ToUniversalTime)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 Uhr.
Seite 1 von 2  1 2      

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