2017-09-18 11 views
0

21:00:00(PM)を開始時刻に、03:00:00(AM)を終了時刻とする2つのtimedelta値がある場合、この範囲内で23:00:00を比較したいそれがこの2つの間にあるかどうか、日付の価値はありません。どうすればいいですか?時間のデルタ値が真夜中を過ぎているかどうかを確認する

この例では、それは21:00:00より23:00:00で拡大表示されますが、だから、それは私の問題である、03:00:00より23:00:00以下は表示されません。私はtimedeltaを使用して24時間の円で時間を比較することができる必要がありますか、timedeltaから離れた変換は問題ありません。

注:開始時刻と終了時刻の範囲が変更される可能性があります。そのため、AM/PMになる可能性があります。だから私は終日の時間に一日を加えるだけではいけません。

+0

diff(23,21)がdiff(23,3)より小さいかどうかを確認しますか? –

+0

終了時刻は開始時刻から24時間以内に保証されていますか?そうでない場合、複雑になる可能性があります。開始時刻が月曜日の午後11時で、終了時刻が水曜日の午前3時であれば、火曜日の午前11時を話している限り、午前11時という任意の時間がそれらの間にあります。これが可能であれば、開始時刻と終了時刻以外の何かが必要になります。 –

+0

@DavidJenkinsはい、それは常に24時間以内にしかありません。したがって、任意の時間、つまり午後3時を選択した場合、範囲(変更対象)は午前6時から午後12時の間と言いますが、これは範囲内ではありません。 – sgript

答えて

0

絶対時間はdatetime.timedeltaの代わりにdatetime.timeを使用すると思います。それにもかかわらず、ここにはあなたの既存の状況を考慮して動作するはずのものがあります。

def is_in_time_range(start, end, time): 
    if end < start: 
     return start < time or end > time 
    return start < time < end 


from datetime import timedelta 

>>> is_in_time_range(timedelta(hours=21), timedelta(hours=3), timedelta(hours=23)) 
True 
>>> is_in_time_range(timedelta(hours=21), timedelta(hours=3), timedelta(hours=4)) 
False 
>>> is_in_time_range(timedelta(hours=21), timedelta(hours=3), timedelta(hours=2)) 
True 

あなたは、私が提案してきたように代わりdatetime.timeを使用することを決定した場合、この解決策はまだ動作します:

from datetime import time 
>>> is_in_time_range(time(hour=21), time(hour=3), time(hour=23)) 
True 
>>> is_in_time_range(time(hour=21), time(hour=3), time(hour=4)) 
False 
>>> is_in_time_range(time(hour=21), time(hour=3), time(hour=2)) 
True 
0

これは、終了時刻がSTARTTIME(IE、翌日)よりも小さい場合にのみ、「困難」になり。しかし、このような場合には、3つの項目すべてに12時間を追加するテストを行うことができます。今では、11amが午前9時から午後3時の間であることを簡単にテストして検証できます。

関連する問題