【问题标题】:Converting DateTime format to another DateTime Format in Lua在 Lua 中将 DateTime 格式转换为另一种 DateTime 格式
【发布时间】:2017-05-18 20:42:23
【问题描述】:

我遇到了一个问题,即使用日期值发送到应用程序以进行某些需要首先格式化为不同 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' 的错误参数 #2(预期数字,得到字符串)

我的假设

我认为这意味着数据类型是字符串而不是日期时间类型,并且需要在os.date 使用它之前对其进行转换。我还假设我可以将我必须的日期时间字符串的值传递给os.date,它会明智地输出相同的日期时间值,但我需要的是新格式。

我已经阅读了关于需要解析出日期时间值的各个部分然后使用这些解析出的部分来构建您需要的格式的各种帖子。我发帖是希望有人可以帮助我在这项任务中朝着正确的方向前进,这样我就不必经历大量的反复试验和大量阅读,但我会一直这样做,直到我听到回来或放弃这一天。

简单回顾

  • 我从一个值开始:05/17/2017 05:17:00 PM

  • 我想将此值设为2017-05-17 17:17:00

使用新格式化的日期时间,我可以用它做一些事情让应用程序处理。

其他

将探索解决此问题的任何级别的 Lua 逻辑,无论是自定义函数、用于格式化日期时间的不同内置函数等。我对所有想法持开放态度,只是展示了 print() 和 @ 987654329@ 函数在我的示例中保持简单,但我对更复杂的东西持开放态度。

【问题讨论】:

    标签: datetime lua formatting


    【解决方案1】:

    与其他语言不同,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
    

    【讨论】:

    • 谢谢!另外,您对括号的看法是正确的 - 我现在已经在我的回答中修正了它们。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2012-10-17
      • 2013-03-14
      • 2021-06-02
      相关资源
      最近更新 更多