如何从 Lua NodeMCU 中的日期和时间字符串创建日期对象?
Posted
技术标签:
【中文标题】如何从 Lua NodeMCU 中的日期和时间字符串创建日期对象?【英文标题】:How can I create Date Object from Date and Time Strings in Lua NodeMCU? 【发布时间】:2016-11-19 00:50:43 【问题描述】:我在 ESP8266 上玩 NodeMCU。我有一个来自 Web 请求的日期字符串和时间字符串,如下所示:
15.07.16(德文格式 DD.MM.YY)
19:50(24 小时制)
这些日期时间通常在未来一点。我想从上面的字符串中获取从当前时间到时间的分钟数。
我想我必须从字符串中创建一个时间对象,然后将其与当前时间进行比较。但是我怎么能用 Lua 做到这一点呢?
不幸的是 NodeMCU 上没有 os 库(或者我可能错过了如何启用它)。
手动计算差异将是一个巨大的痛苦,我想避免。有谁知道用可用或外部库计算它的方法?
感谢大家的支持!
【问题讨论】:
www.google.com 输入“lua 时间”。打开第一个结果...如果您想使用 Lua,我强烈建议您至少阅读涵盖这两个主题的语言参考。它还将回答许多即将提出的问题。 感谢您的快速回答。我当然已经这样做了。但是在我的 ESP8266 上没有 os,也没有 os.time 这个可以关闭吗? 【参考方案1】:首先你使用 Lua 的字符串库从字符串中获取数字:
https://www.lua.org/pil/20.html
https://www.lua.org/manual/5.3/manual.html#6.4
然后你使用 Lua 的 os 库进行时间计算:
https://www.lua.org/pil/22.1.html
https://www.lua.org/manual/5.3/manual.html#6.9
我不会给你更多信息,因为你没有表现出自己解决问题的任何努力。
插件:
由于您没有 os 库(不知道),您可以简单地自己计算这些东西。
使用 string.sub 或字符串模式从字符串中获取月、年小时和分钟数。
然后简单地计算时间差。你知道每个月有多少天。你知道每小时多少分钟和每天多少小时。 判断年份是否为闰年(如果你不知道怎么做:https://support.microsoft.com/en-us/kb/214019)
【讨论】:
对不起,我应该说,我使用nodeMCU。固件上没有操作系统库。 顺便说一句,不需要对我投反对票,只是因为你相信我没有表现出任何努力自己解决它。我提供了所有需要的信息,除了我使用的是 nodeMCU。你的回答太傲慢了,对 ESP 上的人一点帮助都没有。 您的问题不符合关于 SO 的好问题的建议。所以我不赞成。就那么简单。阅读How to Ask @Piglet 我不想就 SO 上的好/坏风格进行一场激烈的战争。因此,这是我将留下的唯一评论。除了缺少NodeMCU
关键字之外,IMO 问题完全没问题。我希望新加入 SO 的人能受到更多的同情和友好的指导。
@Piglet 还是谢谢你。我正在寻找一种计算方法。我不可能手动这样做。【参考方案2】:
pending PR 与 rtctime 完全相反,Unix 纪元到 UTC 日历。
如果您将字符串转换为 Unix 纪元 X,您可以这样做
-- delta in minutes
local delta = (X - rtctime.get()) / 60
您可以自己计算 X
,由于闰年和秒以及其他日期/时间异常,这绝非易事,或者您可以向 http://www.convert-unix-time.com/api?date=15.07.2016%2019:50&timezone=Vienna&format=german 发送请求并从中提取时间戳。
【讨论】:
谢谢马塞尔!这看起来很有希望。简单直接。我刚刚注意到,我的固件没有使用 rtctime 支持编译。所以我明天会试试,让你知道。 考虑固件中对X
范围的浮点支持。
我刚刚做了一个支持 rtctime 的自定义构建。你有什么想法,为什么 rtctime.get() 为我返回 0,0?
我发现了这个.... "当 ESP8266 启动时,实时时钟 (RTC) 未初始化。如果您的物联网项目需要在其生成的数据中提供时间戳,那么您的代码网络可用后,将需要从服务器获取当前日期时间。”所以 RTC 对我来说没用。但是我能做的是发送一个对 x 的请求和一个对 currentTime 的请求(我之前在一些 http 标头中作为字符串得到),然后简单地减去时间戳。这将需要更多的 http 请求,但我找不到更好的方法。
直接进入源代码并阅读 rtctime 模块的介绍以了解其运作方式。它解释了如何结合 SNTP 模块使用它来同步时间。作为替代方案,您可以将 HTTP HEAD 请求发送到受信任的服务器,并从响应标头中解析时间戳。 Jason 对此有一篇不错的博文:blog.falafel.com/set-current-datetime-nodemcu以上是关于如何从 Lua NodeMCU 中的日期和时间字符串创建日期对象?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Lua 和 8266 tmr.stop 的 nodemcu