Lua秒格式问题
我有这个功能:Lua秒格式问题,lua,Lua,我有这个功能: function SecondsFormat(X) if X <= 0 then return "" end local t ={} local ndays = string.format("%02.f",math.floor(X / 86400)) if tonumber(ndays) > 0 then table.insert(t,ndays.."d ") end local nHours = string.format("%02
function SecondsFormat(X)
if X <= 0 then return "" end
local t ={}
local ndays = string.format("%02.f",math.floor(X / 86400))
if tonumber(ndays) > 0 then table.insert(t,ndays.."d ") end
local nHours = string.format("%02.f",math.floor((X/3600) -(ndays*24)))
if tonumber(nHours) > 0 then table.insert(t,nHours.."h ") end
local nMins = string.format("%02.f",math.floor((X/60) - (ndays * 1440) - (nHours*60)))
if tonumber(nMins) > 0 then table.insert(t,nMins.."m ") end
local nSecs = string.format("%02.f", math.fmod(X, 60));
if tonumber(nSecs) > 0 then table.insert(t,nSecs.."s") end
return table.concat(t)
end
因为date:match偶尔会出错,试图与“nil”进行比较,但是os.date在文献中没有提到将nil作为字符串或表返回,所以尽管额外的代码行修复了这个问题,但我想知道为什么会出现这种行为,因为我确信我在以前的返回中捕获了所有非事件
2:有时我会看到像myfunction(…)这样编写的函数,我确信这只会删除参数,如果是这样的话,有没有一行代码可以删除前3条“if”语句?为什么不让Lua的
os
库为您做些艰苦的工作呢
也许有一种更容易(阅读:更好)的方法来找出与01/01/70
的区别,但下面是一个如何使用它的快速方法:
function SecondsFormat(X)
if X <= 0 then return "" end
local date = os.date("%c", X) -- will give something like "01/03/70 03:40:00"
local inPattern = "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)"
local outPattern = "%dy %dm %dd %dh %dm %ds"
local month, day, year, hour, minute, second = date:match(inPattern)
month = month - 1
day = day - 1
year = year - 70
return string.format(outPattern, year, month, day, hour, minute, second)
end
为什么不让Lua的
os
库为您做这些艰苦的工作呢
也许有一种更容易(阅读:更好)的方法来找出与01/01/70
的区别,但下面是一个如何使用它的快速方法:
function SecondsFormat(X)
if X <= 0 then return "" end
local date = os.date("%c", X) -- will give something like "01/03/70 03:40:00"
local inPattern = "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)"
local outPattern = "%dy %dm %dd %dh %dm %ds"
local month, day, year, hour, minute, second = date:match(inPattern)
month = month - 1
day = day - 1
year = year - 70
return string.format(outPattern, year, month, day, hour, minute, second)
end
您可以使用该函数以可用格式获取日期值。'*t'
格式化参数使返回的日期成为表而不是字符串
local t = os.date('*t')
print(t.year, t.month, t.day, t.hour, t.min, t.sec)
print(t.wday, t.yday)
默认情况下,os.data使用当前时间,如果需要,您可以传递一个明确的时间(有关详细信息,请参阅os.data文档)
至于桌上表演,我不担心。不仅您的函数没有经常调用,而且表处理比您可能正在做的其他事情(调用os.date、大量字符串格式等)要便宜得多。您可以使用该函数以可用的格式获取日期值。'*t'
格式化参数使返回的日期成为表而不是字符串
local t = os.date('*t')
print(t.year, t.month, t.day, t.hour, t.min, t.sec)
print(t.wday, t.yday)
默认情况下,os.data使用当前时间,如果需要,您可以传递一个明确的时间(有关详细信息,请参阅os.data文档)
至于桌上表演,我不担心。不仅您的函数没有经常调用,而且表处理比您可能正在做的其他事情(调用os.date、大量字符串格式等)要便宜得多。操作系统库可以为您做更多的工作。如果您将
'*t'
作为格式参数传递,它将返回一个包含信息的表,而不是字符串,这样您就不需要进行任何模式匹配。@missingno是的,只是看到了它并对其进行了编辑(给您一个学分;)。谢谢。在return string.format中,如果年/月/日为0,但始终保留00h 00m 00s,我怎么能退出呢?使用内联if函数:函数iif(cond,tru,fls)如果cond,则返回tru,否则返回fls end
——然后可以执行iif(date.year>0,date.year),iif(date.month>0,date.month),iif(date.day>0,date.day)。@Josh,但这不会改变输出模式。操作系统库可以为您做更多的工作。如果您将'*t'
作为格式参数传递,它将返回一个包含信息的表,而不是字符串,这样您就不需要进行任何模式匹配。@missingno是的,只是看到了它并对其进行了编辑(给您一个学分;)。谢谢。在return string.format中,如果年/月/日为0,但始终保留00h 00m 00s,我怎么能退出呢?使用内联if函数:函数iif(cond,tru,fls)如果cond,则返回tru,否则返回fls end
——然后可以执行iif(date.year>0,date.year),iif(date.month>0,date.month),iif(date.day>0,date.day)。@Josh,但这不会改变输出模式。我不明白你为什么在那里把ndays
转换成一个字符串,然后再把它转换回一个数字。如果我是你,我会先做ndays=math.floor(…)
,然后做如果ndays>0,然后做table.insert(string.format(“%02fd”,ndays))
我不明白你为什么要把ndays
变成一个字符串,然后再把它转换回一个数字。如果我是你,我会先做ndays=math.floor(…)
,然后做如果ndays>0那么table.insert(string.format(“%02fd”,ndays))
@m.buettner:Ha,我还修复了另一个打字错误,而你不看@m、 buettner:哈,我也在你不注意的时候修正了另一个打字错误!
local t = os.date('*t')
print(t.year, t.month, t.day, t.hour, t.min, t.sec)
print(t.wday, t.yday)
local t = os.date('*t', x)