Lua中将DateTime格式转换成另一种DateTime格式
我遇到了一个问题,就是一个日期值用于发送给应用程序进行一些需要首先格式化为另一种DateTime格式的处理。
我有
我有一个DateTime值,格式为:
MM/DD/YYYY hh:mm:ss [AM/PM]
我需要
使用Lua,我需要将其转换为DateTime格式:
YYYY-MM-DD hh:mm:ss
我尝试了很多不同的方法,但都没有成功,我将发布我尝试的东西,感觉可能是最合适的,但也许这完全不对,有更简单或者更简单的LUA方法。
我尝试了什么
print(os.date("%Y-%m-%d %H:%M:%S","05/17/2017 05:17:00 PM"))
错误
stdin:1: bad argument #2 to 'date'(number expected, got string)
我的假设
我想这意味着数据类型是字符串,而不是datetime类型,需要在使用os.date之前将其转换。我还假设我可以将我拥有的datetime字符串的值传递给os.date,它将输出相同的datetime值,但是在我需要的新格式。
我已经阅读了各种文章,需要解析出datetime值的各个部分,然后使用这些解析出的部分来构建所需的格式。我发布这篇文章是希望有人能够帮助我指导我正确的方向,以便我不必经历更多的试错运行和更多的阅读,但在我收到回复或放弃当天之前,我将一直这样做。
简单重述
我从以下值开始:
05/17/2017 05:17:00 PM我想要将这个值变成
2017-05-17 17:17:00
使用新格式化的datetime,我就可以对其进行一些处理,并将其用于应用程序。
其他
将探索解决此问题的任何级别的Lua逻辑,无论是自定义函数、不同的内置函数来获取datetime格式,等等。我开放所有的想法,在我的例子中只是显示了print()和os.date()函数,使其简单化,但我也愿意尝试更复杂的方法。
与其他语言不同,Lua 没有 DateTime 类型;Lua 中的日期和时间是通过字符串、数字和字符串和数字的表来表示的。这意味着在 Lua 中有许多处理日期的方式,最好的方式取决于您的情况。
您从 os.date 得到的错误是因为第二个参数应该是一个Unix 时间中的数字(自1970年1月1日以来的秒数)。为了在您的情况下使其工作,您需要使用 os.time 函数将时间戳转换为 Unix 时间。但是,os.time 需要以数字为输入的表,因此您需要进行实际的日期解析并从日期字符串中找到数字。
然而,在您的情况下,您的输入是一个字符串,您想得到一个类似的字符串,因此您可以通过仅进行日期解析而不使用 os.date 和 os.time 来完成。这就是 @tonypdmtr 在他的答案中使用 string.gsub 做的事情。以下是执行类似操作的方式,使用 string.match 和 string.format:
local date = '05/17/2017 05:17:00 PM'
local month, day, year, hours, minutes, seconds, amPm = date:match('^(%d%d)/(%d%d)/(%d%d%d%d) (%d%d):(%d%d):(%d%d) ([AP]M)$')
if not month then
-- Our entire match failed, and no captures were made
error('could not parse date "' .. date .. '"')
end
if amPm == 'PM' then
hours = string.format('%2d', tonumber(hours) + 12)
end
local newDate = string.format(
'%s-%s-%s %s:%s:%s',
year, month, day, hours, minutes, seconds
)
print(newDate) -- 2017-05-17 17:17:00
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你可以始终使用 :gsub 来进行任何你想要的转换。
a ='05/17/2017 05:17:00 PM' b = a:gsub('(%d%d)/(%d%d)/(%d%d%d%d) (%d%d)(:%d%d:%d%d) ([AP]M)', function(a,b,c,d,e,am_pm) return c .. '-' .. a .. '-' .. b .. ' ' .. (am_pm == 'AM' and d or ('%2d'):format(d+12)) .. e end) print(a) print(b)