【问题标题】:Convert a string date to a timestamp将字符串日期转换为时间戳
【发布时间】:2011-05-05 12:52:49
【问题描述】:

有没有什么简单的方法可以将 RFC HTTP 日期转换为 Lua 中的时间戳?

"Sat, 29 Oct 1994 19:43:31 GMT"

进入

783467011

【问题讨论】:

    标签: date lua


    【解决方案1】:

    如果考虑夏令时,上述Arrowmaster的答案将是完美的。也使用数组看起来更干净。

    s="Sat, 29 Oct 1994 19:43:31 GMT"
    p="%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) GMT"
    date={}
    date['day'],date['month'],date['year'],date['hour'],date['min'],date['sec']=s:match(p)
    MON={Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12}
    date['month']=MON[date['month']]
    date["isdst"] = false  -- new code
    offset=os.time()-os.time(os.date("!*t"))
    print(os.time(date)+offset)
    

    【讨论】:

      【解决方案2】:

      使用luadate,可以用luarocks安装。

      date = require 'date'
      local d1 = date('Sat, 29 Oct 1994 19:43:31 GMT')                                                                                               
      local seconds = date.diff(d1, date.epoch()):spanseconds()
      print(seconds)
      

      【讨论】:

      • 如果我的 dateformat 是 '"2021-12-16T12:28:21.190344545Z"' 并且我想以毫秒为分辨率找出 epochtime 和这个 UTC 时间之间的差异怎么办?
      【解决方案3】:

      如果您需要将值转换为 unix 时间戳,执行此操作的代码如下:

      -- Assuming a date pattern like: yyyy-mm-dd hh:mm:ss
      local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)"
      local timeToConvert = "2011-01-01 01:30:33"
      local runyear, runmonth, runday, runhour, runminute, runseconds = timeToConvert:match(pattern)
      
      local convertedTimestamp = os.time({year = runyear, month = runmonth, day = runday, hour = runhour, min = runminute, sec = runseconds})
      

      【讨论】:

      • 查看我的答案以及它所做的额外时区处理。只有当日期是当前时区(和夏令时)作为它运行的系统时,您的答案才有效。
      【解决方案4】:

      更正 lhf 的示例代码以考虑时区,因为 os.time() 无法指定时区。还假设所有输入都以 GMT 结束,因为这只适用于 GMT。

      s="Sat, 29 Oct 1994 19:43:31 GMT"
      p="%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) GMT"
      day,month,year,hour,min,sec=s:match(p)
      MON={Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12}
      month=MON[month]
      offset=os.time()-os.time(os.date("!*t"))
      print(os.time({day=day,month=month,year=year,hour=hour,min=min,sec=sec})+offset)
      

      这给了我们 783477811。我们将使用 os.date("!%c") 进行验证,因为 !将以 UTC 而不是本地时区输出。

      print(os.date("!%c",783477811))
      --> Sat Oct 29 19:43:31 1994
      

      【讨论】:

        【解决方案5】:

        除了不处理时区之外,下面的代码就是这样做的:

        s="Sat, 29 Oct 1994 19:43:31 GMT"
        p="%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) (%a+)"
        day,month,year,hour,min,sec,tz=s:match(p)
        MON={Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12}
        month=MON[month]
        print(os.time({tz=tz,day=day,month=month,year=year,hour=hour,min=min,sec=sec}))
        

        但它会打印 783467011。下面的代码告诉我们 1288374211 是不同的日期:

        print(os.date("%c",1288374211))
        --> Fri Oct 29 15:43:31 2010
        print(os.date("%c",783467011))
        --> Sat Oct 29 19:43:31 1994
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-16
          • 2016-09-15
          • 1970-01-01
          • 2019-07-30
          • 1970-01-01
          • 2012-05-16
          • 2012-06-23
          • 2011-09-23
          相关资源
          最近更新 更多