2017-05-22 89 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)。