我有这个功能:
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
我想增加几周和几个月的时间,但是因为一个月中的日子并不总是一样,所以我无法在月份部分继续前进,所以任何人都可以提供一些帮助吗?
第二个问题是,使用表格来存储结果是处理这个问题的最有效方法吗?给定函数将每 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
我将该函数合并到主函数中,因为我认为它可能会更快,但我现在有两个问题:
1:我必须添加
if date == nil then return "--" end
因为它偶尔会在 date:match 尝试与“nil”进行比较时出错,但是 os.date 在文献中没有提到将 nil 作为字符串或表格返回,所以尽管额外的代码行解决了这个问题,但我想知道为什么行为发生是因为我确定我在之前的回报中捕获了所有非事件?
2:有时我会看到像 myfunction(...) 这样编写的函数,我确信它只是取消了参数,如果是这样,是否有一行代码可以取消前 3 个“if”语句?