用 LUA 运行服务器并且需要每天在特定时间触发一个函数

所以我在运行一个每分钟执行一次的 LUA 脚本,这由软件控制,我无法控制执行的时间。我想每天检查时间并在特定时间触发一个函数。但是,在发生这种情况之前我想提前 5 分钟执行另一个脚本。

目前,我正在使用 os.date() 进行字符串比较,并将其解析为一个字符串。虽然这个方法是有效的,但代码不那么优美,如果时间发生变化,我必须手动更改两个不同变量的时间。我是 LUA 的新手,所以一直在努力找到最好的方法来解决这个问题。

所以,问题是,如何设置一个时间变量,并将该变量与 os.date(或 os.time)进行比较?

点赞
用户1599009
用户1599009

在纯 Lua 中没有华丽的定时器实现方式。为了避免使用 os.date() 字符串,您可以通过设置预设日期的方式生成时间戳,os.time 接受 key-value 表来设置日期:

timestamp = os.time({year=2019, month=1, day=n})

通过迭代增加变量 n,您将收到自2019年1月1日后每个新日期的时间戳。例如:

os.date("%Y-%m-%d %H-%M-%S",os.time({year=2019,month=1,day=900})
--> 2021-06-18 12-00-00

如果您无法保存日期变量(在应用程序重新启动之间跟踪),请获取当前 “今天” 的日期,然后从那里迭代:

os.date("%Y-%m-%d %H-%M-%S",
    os.time({year=os.date("%Y"),month=os.date("%m"),day=os.date("%d")+n}
)

使用自定义格式和 os.time 的 os.date 使您的代码不依赖于当前设置的日期 locale


确定第一个任务的时间戳后,将第二个实际任务偏移五分钟 secondTaskTimestamp = fistTaskTimestamp + 5*60(或再次使用 os.time )。现在,您的定时器检查器只应比较时间戳。

现在当您需要更改预配置的时间时,您只需要更改第一个任务的时间日期,第二个任务将自动偏移。

相关:在 Lua 中如何在特定日期的特定时间执行全局函数?

2019-03-01 16:17:03