2017-05-22 90 views
0

我一直在嘗試與ntp服務器同步時間,但是,nodemcu似乎忽略了服務器參數。Sntp.sync()忽略服務器

-- 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) 

執行..

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

的時間響應是UNIX信號出現時間(https://www.epochconverter.com/)。它應該是服務器參數時間(在這種情況下,法國)?我嘗試了幾種不同的服務器(即http://www.pool.ntp.org/zone/europe),但響應仍然相同。

有什麼建議嗎?謝謝!

+0

不,時代是UTC。您必須將時區應用於結果以獲取當地時間。我不確定您的環境中有哪些可以爲您提供的服務,但法國比UTC早2小時。 – ktb

+0

@ktb所以...如果它始終返回UTC時間,爲什麼允許ntp服務器作爲參數? – hugalves

+0

你確實希望你的時間修正是準確的,對吧?那麼,如果你住在法國,你需要一臺法國服務器,而不是日本服務器來告訴你時間。離你居住地比較遠一點。 – ktb

回答

0

該行爲是正確的。如果你想使用時區,你需要所謂的"zone files" from the tz database。每個tz文件包含(除其他信息外)諸如夏令時等轉換,並且還記錄閏秒。

有一個如何處理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) 

所以,你需要tz.lua加上時區(S)你(在本例中「東部」)感興趣的區域文件(S)。