【问题标题】:Sntp.sync() ignores serverSntp.sync() 忽略服务器
【发布时间】:2017-05-24 02:47:47
【问题描述】:

我一直在尝试与ntp服务器同步时间,但是nodemcu似乎忽略了服务器参数。

-- 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),但响应仍然相同。

有什么建议吗?谢谢!

【问题讨论】:

  • 不,纪元时间是 UTC。您必须对结果应用时区才能获得当地时间。我不确定您的环境中有什么可以为您做到这一点,但法国比 UTC 早 2 小时。
  • @ktb so...如果它总是返回UTC时间,为什么允许ntp服务器作为参数?
  • 您确实希望您的时间修正准确,对吧?好吧,如果你住在法国,你想要一个法国服务器,而不是日本服务器来告诉你时间。离你住的地方有点远。
  • @ktb 我想获取作为参数传递的 sntp 服务器的时间。我想知道如果我使用 sntp 法国服务器,我会得到法国时间。然而,这并没有发生。它总是返回 unix 时间。问题是:这对吗?
  • 没错。无论您从哪里获得时间,它始终是 UTC。

标签: lua esp8266 nodemcu


【解决方案1】:

行为是正确的。如果你想使用时区,你需要所谓的"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 以及您感兴趣的时区的时区文件(示例中为“东部”)。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2018-07-24
    • 2017-05-09
    相关资源
    最近更新 更多