有没有办法对 Lua 中的特定日期进行倒计时?

Is there a way to make a countdown to a specific date in Lua?

所以在听说Lua比python更通用后,我只是在修补Lua,所以我尝试以DDD:HR:MN:SC的形式来倒计时一年.如果有人能给我一个例子,将不胜感激!

要获取有关日期的详细信息,请使用带有字符串参数 "*t" 的函数 os.date。这个调用returns一个table包含分钟、天、年等信息

使用它,您可以编写一个简单的函数来检索当前日期并根据您的喜好设置格式。在这个例子中,我使用了 yyyy/mm/dd 格式。

function format_date()
    local function tbl = os.date("*t")
    local date = string.format("%d/%d/%d", t.year, t.month, t.day)
    return date
end

print(format_date())

> 2019/11/19

函数 os.time returns 自当前纪元开始以来的时间(以秒为单位)。这可能是另一种制作倒数计时器的方法。

Here 是关于 Lua OS 图书馆的页面的 link。

您可以使用 os.date 将当前日期检索为 table,然后只需像这样按分量减去差值:

local function print_remaining(target)
   local current = os.date("*t")
   print(string.format("%i years, %i months and %i days",
      target.year-current.year,
      target.month-current.month,
      target.day-current.day
   ))
end

local function countdown(target)
   while true do
      print_remaining(target)
      os.execute('sleep 1')
   end
end

countdown {year = 2019, month=12, day=25}

如果你想让它更酷,当然你必须根据剩余时间调整显示的组件。


受@csaars回答的启发,我改变了一些东西并最终得到了这个

local function split(full, step, ...)
  if step then
    return math.floor(full % step), split(math.floor(full / step), ...)
  else
    return full
  end
end

local function countdown(target)
   local s, m, h, d = split(os.difftime(os.time(target), os.time()), 60, 60, 24)
   print(string.format("%i days, %i:%i:%i", d, h, m, s))
   if os.execute('sleep 1') then
      return countdown(target)
   end
end

countdown {year = 2019, month=12, day=25}

plit 函数比这个例子需要的要复杂一些,但我认为这是一个很好的机会来展示如何用可变递归函数很好地表达某些东西Lua.

以下代码应该完全符合您的要求:

local function sleep(s)
  local t = os.clock() + s
  repeat until os.clock() > t
end

local function getDiff(t)
  return os.difftime(t, os.time())
end

local function dispTime(t)
  local d = math.floor(t / 86400)
  local h = math.floor((t % 86400) / 3600)
  local m = math.floor((t % 3600) / 60)
  local s = math.floor((t % 60))
  return string.format("%d:%02d:%02d:%02d", d, h, m, s)
end

local function countdown(tTbl)
  local diff = getDiff(os.time(tTbl))

  repeat
    print(dispTime(diff))
    -- os.execute('echo ' .. dispTime(diff))
    sleep(1)
    diff = getDiff(os.time(tTbl))
  until (diff <= 0)
end


countdown{
  day = 24,
  month = 12,
  year = 2019,
  hour = 0,
  min = 0,
  sec = 0
}

只要确保倒计时没有超过 2038 年 1 月 19 日。Unix 时间将无法超过该时间。整数溢出是问题所在。