将字符串日期转换为时间戳

Bor*_*ade 10 lua date

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

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

783467011

Arr*_*ter 19

更正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)
Run Code Online (Sandbox Code Playgroud)

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

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


lhf*_*lhf 9

下面的代码执行此操作,但它不处理时区:

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}))
Run Code Online (Sandbox Code Playgroud)

但它打印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
Run Code Online (Sandbox Code Playgroud)


小智 9

如果您需要将值转换为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})
Run Code Online (Sandbox Code Playgroud)


小智 5

使用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)
Run Code Online (Sandbox Code Playgroud)