我有这个功能:
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
我想补充几个星期和几个月的时间,但是因为一个月内的日子并不总是一样,所以有人能提供一些帮助吗? / p>
第二个问题是,使用表来存储结果是最有效的处理方式,因为每3秒钟最多可以调用100个项目(在网格中)?
修改
function ADownload.ETA(Size,Done,Tranrate) --all in bytes
if Size == nil then return "--" end
if Done == nil then return "--" end
if Tranrate == nil then return "--" end
local RemS = (Size - Done) / Tranrate
local RemS = tonumber(RemS)
if RemS <= 0 or RemS == nil or RemS > 63072000 then return "--" end
local date = os.date("%c",RemS)
if date == nil then return "--" end
local month, day, year, hour, minute, second = date:match("(%d+)/(%d+)/(%d+) (%d+): (%d+):(%d+)")
month = month - 1
day = day - 1
year = year - 70
if tonumber(year) > 0 then
return string.format("%dy %dm %dd %dh %dm %ds", year, month, day, hour, minute, second)
elseif tonumber(month) > 0 then
return string.format("%dm %dd %dh %dm %ds",month, day, hour, minute, second)
elseif tonumber(day) > 0 then
return string.format("%dd %dh %dm %ds",day, hour, minute, second)
elseif tonumber(hour) > 0 then
return string.format("%dh %dm %ds",hour, minute, second)
elseif tonumber(minute) > 0 then
return string.format("%dm %ds",minute, second)
else
return string.format("%ds",second)
end
end
我将函数合并到main函数中,因为我认为它可能会更快但我现在有两个问题:
1:我必须添加
if date == nil then return "--" end
因为它偶尔会出现日期错误:匹配尝试与“nil”进行比较但是os.date在文献中没有提到关于将nil作为字符串或表格返回的问题,所以尽管额外的代码行修复了问题我是想知道为什么会发生这种行为,因为我确定我在之前的回报中发现了所有非事件?
2:有时候我看到函数写成了myfunction(...)而且我确信它只是取消了参数,如果有的话,那么有一行代码可以取消前3个“if”语句?
答案 0 :(得分:3)
您可以使用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文档)
local t = os.date('*t', x)
至于表性能,我不担心。不仅经常调用你的函数,而且表处理比你可能正在做的其他事情便宜得多(调用os.date,大量字符串格式化等)
答案 1 :(得分:2)
为什么不让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
我认为这比构建表格和多次调用string.format
要快得多 - 但你必须对其进行分析。
编辑:我使用两种方法运行了两个连接"abc"
,"def"
和"ghi"
的函数的快速测试。将这些字符串插入表中连续花费14秒(当然是几百万次运行)并使用单个string.format()
需要6秒。这没有考虑到,你的代码无论如何都要调用string.format()
(多次) - 也不是你通过除法来计算值而我用模式匹配来调用它们之间的区别。模式匹配肯定较慢,但我怀疑它超过了没有桌子的收益 - 能够利用os.time()
当然很方便。最快的方法可能是手动计算月份和日期,然后使用单个string.format()
。但同样 - 你必须对此进行分析。
EDIT2: missingno与使用"*t"
os.date
选项在第一时间分别为您提供值是一个很好的观点。同样,这取决于您是否希望有一个方便的表与存储的字符串或任何原因。结合"*t"
和单string.format
:
function SecondsFormat(X)
if X <= 0 then return "" end
local date = os.date("*t", X) -- will give you a table
local outPattern = "%dy %dm %dd %dh %dm %ds"
date.month = date.month - 1
date.day = date.day - 1
date.year = date.year - 70
return string.format(outPattern, date.year, date.month, date.day, date.hour, date.min, date.sec)
end