【问题标题】:Checking if time-delta value is in range past midnight检查时间增量值是否在午夜之后的范围内
【发布时间】:2017-09-18 23:43:24
【问题描述】:

因此,如果我有两个 timedelta 值,例如 21:00:00(PM) 作为开始时间,03:00:00(AM) 作为结束时间,我希望在此范围内比较 23:00:00,看看它是否介于这两者之间二、没有日期值怎么办?

所以虽然在这个例子中它会看到23:00:00 大于21:00:00 它不会看到23:00:00 小于03:00:00,这是我的问题。我需要能够使用 timedelta 比较 24 小时循环上的时间,或者从 timedelta 进行转换就可以了。

注意:开始/结束时间范围可能会发生变化,因此任何时间范围都可能是 AM/PM。因此,例如,我不能只在结束时间上加一天。

【问题讨论】:

  • 检查 diff(23, 21) 是否小于 diff(23, 3)?
  • 结束时间是否保证在开始时间的24小时以内?如果没有,它可能会变得复杂。如果开始时间是星期一晚上 11 点,结束时间是星期三凌晨 3 点,那么只要您说的是星期二上午 11 点,那么任意时间都会说上午 11 点介于两者之间。如果有可能,您需要的不仅仅是开始和结束时间。
  • @DavidJenkins 是的,它只会在 24 小时内,一直如此。因此,当您选择任意时间,即下午 3 点,但您的范围(可能会发生变化)仅表示早上 6 点到下午 12 点时,这不应该在范围内。

标签: python time compare timedelta


【解决方案1】:

只有当 endtime 小于 starttime 时(IE,第二天)才变得“困难”。但是,您可以进行测试,如果是这种情况,将所有三个项目添加 12 小时,这样您现在可以轻松测试并验证上午 11 点是在上午 9 点到下午 3 点之间。

【讨论】:

    【解决方案2】:

    您可能应该考虑使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多