2017-09-18 83 views
0

所以,如果我有作为起始时间和03:00:00(AM)作为结束两个时间timedelta值,如21:00:00(PM),我希望在这个范围内比较23:00:00,看不管它是在这两者之间,没有日期值,我怎么能这样做?检查是否timedelta值范围在午夜

因此,尽管在这个例子中,将看到23:00:0021:00:00大也不会看到23:00:00小于03: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.time而不是datetime.timedelta。尽管如此,根据您现有的情况,这里应该有所作为。

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

变得“困难”,只有当结束时间比开始时间更小(IE,第二天) 。但是,如果是这种情况,您可以进行测试,为所有三项增加12小时,所以现在您可以轻松测试并确认11am是在上午9点到下午3点之间。