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)