在Lua中将DateTime格式转换为另一种DateTime格式

6

我有一个问题,需要将日期值用于向应用程序发送一些处理,但首先需要将其格式化为不同的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: 'date'的第二个参数错误(应为数字,得到字符串)

我的理解

我认为这意味着数据类型是字符串而不是日期时间类型,需要在使用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()函数,以保持简单,但我也可以接受更复杂的东西。

2个回答

3
与其他语言不同,Lua没有DateTime类型;日期和时间是通过字符串、数字和字符串和数字的表在Lua中表示的。这样做的一个后果是,在Lua中有许多处理日期的方法,最好的方法取决于您的情况。
您从os.date获得的错误是因为第二个参数应该是Unix time(自1970年1月1日以来的秒数)。为了使其在您的情况下起作用,您需要使用os.time函数将您的时间戳转换为Unix时间。但是,os.time需要一个数字表作为输入,因此您需要进行实际的日期解析并从日期字符串中找到这些数字。
然而,在您的情况下,您的输入是一个字符串,您想要的输出也是一个类似的字符串,因此您只需要进行日期解析,而不需要使用os.dateos.time进行转换。这就是@tonypdmtr在他的回答中使用string.gsub的方式。以下是如何使用string.matchstring.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

1
谢谢!你说的括号问题很正确 - 我现在已经修复了它们。 - Jack Taylor

2
你可以随时使用: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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接