【发布时间】:2011-05-05 12:52:49
【问题描述】:
有没有什么简单的方法可以将 RFC HTTP 日期转换为 Lua 中的时间戳?
"Sat, 29 Oct 1994 19:43:31 GMT"
进入
783467011
【问题讨论】:
有没有什么简单的方法可以将 RFC HTTP 日期转换为 Lua 中的时间戳?
"Sat, 29 Oct 1994 19:43:31 GMT"
进入
783467011
【问题讨论】:
如果考虑夏令时,上述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)
【讨论】:
使用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)
【讨论】:
如果您需要将值转换为 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})
【讨论】:
更正 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
【讨论】:
除了不处理时区之外,下面的代码就是这样做的:
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
【讨论】: