![]() |
TIdSNTP liefert immer (noch) Sommerzeit
Ich nutze Delphi 11.2 (Patch 1) unter Windows 11 (22H2):
In unsere Software habe ich vor wenigen Wochen einen Check eingebaut um gegen einen Zeitserver unabhängig vom Rest des Systems gegen einen Zeitserver checken zu können, da unsere Kunden in der Vergangenheit Probleme mit der netzwerkinternen Zeitsynchronisation hatten. Seit Sonntag haben wir "plötzlich" ein Stunde Abweichung. Ich habe es auf den einfachst möglichen Test "eingedampft", einfach eine Form mit TIdSNTP-Komponente und einem Edit um den Server einzugeben. Und selbst so bekomme ich immer noch eine Zeit, die genau eine Stunde in der Zukunft liegt. Habe ich etwas übersehen? Da wir jetzt "Normalzeit" haben hätte ich eher erwartet, dass es in den Vergangenen Wochen (während Entwicklung und Test) Probleme gegeben hätte.
Code:
IdSNTP1.Host:=LabeledEdit1.Text;
memo1.Lines.Add('Server: '+LabeledEdit1.Text+'Internetzeit: '+DateTimeToStr(IdSNTP1.DateTime)); |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Liefert der Zeitserver Greenwich Mean Time also GMT bzw. UTC?
Wir liegen eine Stunde davor, also GMT - 1. Im Sommer GMT - 2. Sollte deine Software mal in Sydney zum Einsatz kommen, musst du momentan eine Differenz von 11 Stunden berücksichtigen (Sommerzeit), bei Normalzeit ist die Differenz 10 Stunden. Die Angabe des Zeitservers dürfte also stimmen. Die Differenz zur örtlichen Zeitzone musst Du selbst berücksichtigen. |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Wie ich schon schrieb: Dann hätte ich letzte Woche 2 Stunden Abweichung haben müssen, stattdessen hat es bis dahin funktioniert.
Zur Verdeutlichung:
Code:
Output:
IdSNTP1.Host:=LabeledEdit1.Text;
memo1.Lines.Add('Server: '+LabeledEdit1.Text+' Internetzeit: '+DateTimeToStr(IdSNTP1.DateTime)+' Systemzeit: '+datetimetostr(now)); Zitat:
|
AW: TIdSNTP liefert immer (noch) Sommerzeit
Was sagt Dir denn
![]() Wenn Du dort über der 6 auf das Dreieck und das t klickst, wird dir die Abweichung der Rechneruhrzeit von der korrekten Uhrzeit angezeigt. |
AW: TIdSNTP liefert immer (noch) Sommerzeit
MEZ (UTC+01:00)
Die lokale Uhr geht 44 ms nach ± 10 ms Windows sagt Zeitzone (UTC+01:00) Amsterdam, Berlin, Bern Rom, Stockholm, Wien |
AW: TIdSNTP liefert immer (noch) Sommerzeit
NTP Server liefern normalerweise UTC Zeit- Für die Umrechnung in die lokAle Zeit ist das Betriebssystem bzw das entsprechende Programm zuständig. Für unsere mitteleuropäische Zeitzone gilt also:
|
AW: TIdSNTP liefert immer (noch) Sommerzeit
Ich benutze die Komponente "TIdSNTP", teil von Indy.
Letzte Woche habe ich die "korrekte" Zeit, also wenn um 11:10 abgefragt habe kam 11:10 als Antwort. Heute kommt bei der Abfrage um 11:10 stattdessen 12:10 als Antwort. Die Komponente konvertiert das selbst. Viel zu konfigurieren habe ich da auch nicht gefunden. |
AW: TIdSNTP liefert immer (noch) Sommerzeit
"Die Komponente konvertiert das selbst", steht das in der Hilfe zu Indy? Dann wäre das ein bug von Indy.
Versuch mal folgendes, das sollte die korrekte Zeitangabe liefern:
Delphi-Quellcode:
uses
DateUtils; var GMT: TDateTime; ... GMT := TTimeZone.Local.ToUniversalTime(IdSNTP1.DateTime); memo1.Lines.Add('Internetzeit GMT: '+DateTimeToStr(GMT)); |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Zitat:
Wenn du mir einen Link zur Hilfe von Indy hast wäre das nett. ![]() |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Zitat:
|
AW: TIdSNTP liefert immer (noch) Sommerzeit
Zitat:
Ich war mal neugierig. Das ist ein Fehler in Indy, und zwar in der Funktion TIdSNTP.NTPToDateTime in der Unit IdSNTP. Die ist dafür verantwortlich, die Bytes, die vom NTP-Server kommen, wieder in ein Delphi-Datum umzuwandeln. Am Ende dieser Funktion steht folgendes:
Delphi-Quellcode:
Zu Deutsch: das Datum, das sich aus der Umrechnung von Value1 und Value2 ergibt, liegt zwei Tage vor dem Delphi-Datum. Die Basis scheint also der 1.1.1900 zu sein und nicht wie beim Delphi-Format der 30.12.1899. Also muss man am Ende noch zwei Tage addieren, um auf das korrekte Delphi-Datum zu kommen, siehe die "+ 2" am Ende. Diese Addition wird aber erst NACH der Zeitzonen-Umrechnung gemacht. Das heißt, die Zeitzonen-Umrechnung erfolgt heute mit dem 28.10.2023 und nicht dem 30.10.2023. Daher geht die Umrechnung noch von Sommerzeit aus und addiert zwei Stunden und nicht eine.
Value2 := Trunc(Value2 / NTPMaxInt * 1000) / 1000;
Result := UTCTimeToLocalTime((Value1 + Value2) / 86400) + 2; Vielleicht kennt sich ja jemand mit Indy aus und kann das an der passenden Stelle als Bug einreichen. |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Nachtrag: Hier ist das schon gefixt:
![]() Ich bin mal optimistisch, dass das zumindest im nächsten Delphi auch gefixt ist. In D11.2 muss man das wohl selber korrigieren. |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Zitat:
|
AW: TIdSNTP liefert immer (noch) Sommerzeit
Ja, habe es durch Hinweis in der englischen DP auch gefunden.
![]() Ich wusste nicht, dass Indy auf GitHub ist und habe es beim Googlen auch nicht gefunden. Dann hoffe ich mal, dass der Fix im Delphi 12 dabei ist. |
AW: TIdSNTP liefert immer (noch) Sommerzeit
Delphi 12 kommt mit einer Indy-Version aus September 2023, also schon ziemlich aktuell.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz