2010-11-05 102 views

回答

8

下面的代码做到这一点,除了它不处理时区:

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 
+3

有关日期+时间库,请参阅http://luaforge.net/projects/date/。 – lhf 2010-11-05 11:14:12

14

更正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 
+0

!很好,thx。 – Tim 2016-03-04 08:26:35

8

如果您需要将值转换为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}) 
+0

查看我的答案和额外的时区处理它。只有在当前时区(和夏令时)与其运行的系统一致时,您的答案才有效。 – Arrowmaster 2011-05-05 22:47:58

4

使用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) 
相关问题