You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua(plantweb optics)报date表缺失'day'字段问题求助

报错根因

field 'day' missing in date table报错直接原因是传入os.time()的日期表中day字段为nil,由两个代码问题导致:

  • 正则匹配逻辑有bug:Lua pattern中.是通配符,匹配任意单字符,你写的规则里秒和毫秒之间的.没有转义,只要tostring(my_obj)输出的内容和预期的YYYY-MM-DD HH:MM:SS.mmm格式有一点偏差(比如前后带类型标记、带时区后缀、分隔符不符),整个匹配就会失败,所有捕获组返回nil。
  • 缺少匹配结果校验:匹配失败后没有做判空,直接把空值组装成表传给os.time(),直接触发报错。

另外还有两个隐性问题:

  • 正则捕获的年月日时分秒都是字符串类型,部分Lua运行环境不会自动转数字,会导致os.time()返回异常。
  • 直接累加86400秒计算次日的逻辑,在夏令时切换、闰秒场景会算错时间。
修复代码

修正正则转义问题,增加匹配结果校验,把捕获的字段显式转成数字,代码如下:

local my_obj = syslib.getobject(myPath)
local my_ts = tostring(my_obj)

-- 转义毫秒前的.,严格匹配时间格式
local y, m, d, Hr, Min, Sec, Milli = my_ts:match('(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)%.(%d+)')
-- 匹配失败直接抛出原始值,方便排查格式问题
if not y then
    error(string.format("时间解析失败,原始输出为: %q", my_ts))
end

-- 显式转数字,兼容所有Lua运行环境
local base_ts = os.time({
    year = tonumber(y),
    month = tonumber(m),
    day = tonumber(d),
    hour = tonumber(Hr),
    min = tonumber(Min),
    sec = tonumber(Sec)
})
local next_ts = base_ts + 24*60*60
local next_time = string.format("%s.%03d", os.date("%Y-%m-%d %H:%M:%S", next_ts), tonumber(Milli))
syslib.setvalue(my_obj, next_time)
额外排查点

如果运行后抛出时间解析失败的错误,先看打印出来的原始时间字符串格式,对应调整正则即可:

  • 如果原始字符串前后有多余字符,在正则前后加.*匹配冗余内容
  • 如果需要规避夏令时/闰秒的计算偏差,可以先拿到os.date("*t", base_ts)返回的时间表,直接对day字段加1再转回时间戳,比直接加秒数更稳妥。

内容的提问来源于stack exchange,提问作者Sekhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:06:25