2017-05-22 5 views
0

Ich habe versucht, Zeit mit NTP-Servern zu synchronisieren, jedoch scheint Nodemcu den Serverparameter zu ignorieren.Sntp.sync() ignoriert Server

-- sync.lua 
sntp.sync("fr.pool.ntp.org", function() 
    tm = rtctime.epoch2cal(rtctime.get()) 
    print(string.format("%04d/%02d/%02d %02d:%02d:%02d", tm["year"], tm["mon"], tm["day"], tm["hour"], tm["min"], tm["sec"])) 
end) 

Execution ..

> dofile('sync.lua') 
> 2017/05/22 21:38:39 

Es ist die Unix-Epoche Zeit (https://www.epochconverter.com/). Soll es die Serverparameterzeit sein (in diesem Fall Frankreich)? Ich versuchte mehrere verschiedene Server (d. H. http://www.pool.ntp.org/zone/europe), aber die Antwort bleibt gleich.

Irgendwelche Vorschläge? Vielen Dank!

+0

Nein, Epochenzeit ist UTC. Sie müssen Zeitzonen auf das Ergebnis anwenden, um die lokale Zeit zu erhalten. Ich bin nicht sicher, was in Ihrer Umgebung für Sie verfügbar ist, aber Frankreich ist 2 Stunden vor UTC. – ktb

+0

@ktb so ... wieso darf man den ntp-server als parameter benutzen, wenn er immer die UTC-zeit zurückgibt? – hugalves

+0

Sie wollen Ihre Zeit beheben, um genau zu sein, oder? Nun, wenn du in Frankreich lebst, willst du einen französischen Server, keinen japanischen Server, der dir die Zeit sagt. Man ist etwas weiter von deinem Wohnort entfernt. – ktb

Antwort

0

Das Verhalten ist korrekt. Wenn Sie mit Zeitzonen arbeiten möchten, benötigen Sie so genannte "zone files" from the tz database. Jede tz-Datei enthält (neben anderen Informationen) Übergänge wie Sommerzeit und zeichnet auch Schaltsekunden auf.

Es gibt ein Beispiel für den Umgang mit timezones in the NodeMCU repository.

tz = require('tz') 
tz.setzone('eastern') 
sntp.sync(nil, function(now) 
    local tm = rtctime.epoch2cal(now + tz.getoffset(now)) 
    print(string.format("%04d/%02d/%02d %02d:%02d:%02d", tm["year"], tm["mon"], tm["day"], tm["hour"], tm["min"], tm["sec"])) 
end) 

So müssen Sie tz.lua und die Zonendatei (en) für die Zeitzone (n) Sie Interesse an (‚östlichen‘ im Beispiel).