2017-07-06 92 views
2

考慮下面的例子之間:的Lua - 計算如果時間是兩個時間戳

--Test current  start  end  between 
--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 
+0

是否'間或(」 01:00「,」09:00「,」02:00「)'返回true? – lhf

+0

@lhf感謝您指出這一點,它應該返回true時返回false。 – HelpingHand

回答

2

你的方法聽起來過於複雜。只需將字符串中的小時和分鐘解析出來並將其轉換爲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 -- add 24 h 
    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 
+0

謝謝你的回覆。如何處理這種情況: 'print(BetweenTimes(「15:00」,「09:00」,「01:00」))' 我想讓這個返回true,因爲15:00是在上午9點到下午1點之間,開始時間> =停止時間。 – HelpingHand

+0

@幫助手什麼? 15:00肯定不會在01:00和09:00之間。至少不是在同一天。 –

+0

@HelpingHand如果'stop'在'start'之前,我加了24小時的包裝。 –

1

爲什麼你甚至只有小時和分鐘時才使用日期?除非你期望在未來處理任何其他時間單位,否則簡單的乘法就足夠了。

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

我不會從亨利門客的答案複製BetweenTimes - 它到底是裏面包裹處理,因爲我parse_time收益分鐘,而不是秒,唯一的變化是相同的:

stop = stop + 24*60