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()函数,使其简单化,但我也愿意尝试更复杂的方法。

点赞
用户3735873
用户3735873

你可以始终使用 :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)
2017-05-17 22:56:55
用户5287638
用户5287638

与其他语言不同,Lua 没有 DateTime 类型;Lua 中的日期和时间是通过字符串、数字和字符串和数字的表来表示的。这意味着在 Lua 中有许多处理日期的方式,最好的方式取决于您的情况。

您从 os.date 得到的错误是因为第二个参数应该是一个Unix 时间中的数字(自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
2017-05-18 01:50:12