AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Differenz zur echten Uhrzeit in Sekunden ermitteln

Differenz zur echten Uhrzeit in Sekunden ermitteln

Ein Thema von philipp.hofmann · begonnen am 15. Jan 2021 · letzter Beitrag vom 21. Jan 2021
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
7.877 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln

  Alt 19. Jan 2021, 09:01
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.
Das ist unter Android z.B. gar nicht möglich. Leider kann eine App dort nur z.B. die Atomzeit als Überblendung anzeigen, damit man diese manuell einstellen kann.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
435 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln

  Alt 19. Jan 2021, 13:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.597 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln

  Alt 19. Jan 2021, 14:06
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (19. Jan 2021 um 14:11 Uhr)
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
435 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln

  Alt 19. Jan 2021, 14:17
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.
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
435 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Differenz zur echten Uhrzeit in Sekunden ermitteln

  Alt 21. Jan 2021, 13:20
So ich habe mich jetzt mal durch Indy-debuggt, der Fehler passierte inIdGlobalProtocols.TimeZoneBias:
Delphi-Quellcode:
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}
  ...
Keine Ahnung, warum die so kompliziert implementiert ist, ich habe es mal mit folgendem Code ersetzt:
Delphi-Quellcode:
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}
  ...
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf