Lua - 判断时间是否在两个时间戳之间

给出以下示例:

--测试   当前     开始     结束     是否在两者之间
--1     10:00    09:00    12:00   true
--2     01:00    07:34    09:54   false
--3     17:00    16:00    03:00   true
--4     10:00    10:00    15:00   true
--5     10:30    10:00    10:30   true

在 Lua 中,如何创建一个可以调用的函数:

BetweenTimes("10:00", "09:00","12:00")

在这种情况下(测试1)返回 true。我遇到的问题是测试用例3。

我可以假设第一个时间永远在第二个时间之前。

我想这可能就是它:

local function parse_time(str)
   local hour, min = str:match("(%d+):(%d+)")
   return os.time{hour = hour, min = min, day = 1, month = 1, year = 1970}
end

local function BetweenTimes(between, start, stop)
   between = parse_time(between)
   start   = parse_time(start)
   stop    = parse_time(stop)

   if stop < start then
      return (start <= between) or (between <= stop)
   else
      return (start <= between) and (between <= stop)
   end
end

print(BetweenTimes("10:00", "09:00", "12:00")) -- true
print(BetweenTimes("15:00", "09:00", "12:00")) -- false
print(BetweenTimes("15:00", "09:00", "01:00")) -- true
print(BetweenTimes("10:00", "10:00", "11:00")) -- true
print(BetweenTimes("11:00", "10:00", "11:00")) -- true
print(BetweenTimes("19:00", "17:00", "03:30")) -- true
print(BetweenTimes("03:00", "04:00", "05:30")) -- false
print(BetweenTimes("03:00", "02:00", "05:30")) -- true
print(BetweenTimes("01:00", "09:00", "02:30")) -- true

或者只需使用以下代码即可删除 os.time():

local function BetweenTimes(between, start, stop)
   local start   = string.gsub(start,":", "")
   local between = string.gsub(between,":", "")
   local stop    = string.gsub(stop,":", "")

   if stop < start then
      return (start <= between) or (between <= stop)
   else
      return (start <= between) and (between <= stop)
   end
end
点赞
用户1944004
用户1944004

你的方法看起来过于复杂了。只需要从字符串中解析出小时和分钟,然后将其转换为 UNIX 时间戳。这些是常规的整数,你可以使用 <> 很容易地进行比较。

local function parse_time(str)
   local hour, min = str:match("(%d+):(%d+)")
   return os.time{hour = hour, min = min, day = 1, month = 1, year = 1970}
end

local function BetweenTimes(between, start, stop)
   between = parse_time(between)
   start   = parse_time(start)
   stop    = parse_time(stop)
   if stop < start then
      stop = stop + 24*60*60 -- 添加 24 小时
   end
   return (start <= between) and (between <= stop)
end

print(BetweenTimes("10:00", "09:00", "12:00")) -- true
print(BetweenTimes("15:00", "09:00", "12:00")) -- false
print(BetweenTimes("15:00", "09:00", "01:00")) -- true
2017-07-06 21:44:12
用户936986
用户936986

为什么你在只有小时和分钟的情况下还使用日期?除非你期望在将来处理其他时间单位,否则简单的乘法就足够了。

local function parse_time(str)
   local hour, min = str:match("(%d+):(%d+)")
   return min * 60 + hour
end

我不会从 Henri Menke 的答案中复制 BetweenTimes - 它完全相同,唯一的更改在于我的 parse_time 返回的是分钟,而不是秒:

stop = stop + 24*60
2017-07-07 13:23:43