【问题标题】:How to check if the current time is in range in python?如何检查当前时间是否在python的范围内?
【发布时间】:2012-05-25 03:05:02
【问题描述】:

我需要检查当前时间是否在时间范围内。最简单的情况time_end > time_start:

if time(6,0) <= now.time() <= time(12,00): print '1'

但是当用户进入结束时间小于开始时间的时间范围时,麻烦就开始了,例如“23:00 - 06:00”。像“00:00”这样的时间将在此范围内。大约 5 年前,我编写了这个 PHP 函数:

function checkInterval($start, $end)
  {    
    $dt = date("H:i:s");    

    $tstart = explode(":", $start);
    $tend =   explode(":", $end);
    $tnow =   explode(":", $dt);

    if (!$tstart[2])
      $tstart[2] = 0;

    if (!$tend[2])
      $tend[2] = 0;  

    $tstart = $tstart[0]*60*60 + $tstart[1]*60 + $tstart[2];
    $tend   = $tend[0]*60*60   + $tend[1]*60   + $tend[2];
    $tnow   = $tnow[0]*60*60   + $tnow[1]*60   + $tnow[2];

    if ($tend < $tstart)
      {
        if ($tend - $tnow > 0 && $tnow > $tstart)
          return true;
        else if ($tnow - $tstart > 0 && $tnow > $tend)
          return true;
        else if ($tend > $tnow && $tend < $tstart && $tstart > $tnow)
          return true;
        else return false;
      } else
      {
        if ($tstart < $tnow && $tend > $tnow)
          return true;
        else
          return false;
      }

现在我需要做同样的事情,但我想让它看起来更好看。那么,我应该使用什么算法来确定当前时间 '00:00' 是否在 reversed 范围内,例如['23:00', '01:00']?

【问题讨论】:

    标签: python datetime range


    【解决方案1】:

    Python 解决方案将会非常非常短。

    def time_in_range(start, end, x):
        """Return true if x is in the range [start, end]"""
        if start <= end:
            return start <= x <= end
        else:
            return start <= x or x <= end
    

    datetime.time 类用于startendx

    >>> import datetime
    >>> start = datetime.time(23, 0, 0)
    >>> end = datetime.time(1, 0, 0)
    >>> time_in_range(start, end, datetime.time(23, 30, 0))
    True
    >>> time_in_range(start, end, datetime.time(12, 30, 0))
    False
    

    【讨论】:

    • 如果 start=today[10:00], end=tomorrow[10:00], x = 11:00 然后start &lt;= x &lt;= end = False!!!
    • @PauloScardine:您必须选择如何解释它: [10:00, 10:00] 的长度是 0 还是 24 小时。任何一种解释都很好。换句话说,你说start &lt; end,但我选择了start &lt;= end,没有明显的理由选择其中一个。
    • 不一定。例如,如果您经营一家每周 7 天从早上 7 点到凌晨 1 点营业的商店怎么办?这正是您需要确定商店是否营业的那种功能。
    • 关于当前时间的问题,但在我看来 datetime.time(23, 30, 0) 不是
    • @DietrichEpp 感谢您的回复,但是如果您只是添加 datetime.datetime.now().time() 会不会更容易?我花了一些时间才在其他地方找到它
    【解决方案2】:

    日期/时间比你想象的要复杂

    涉及日期/时间的计算可能非常棘手,因为您必须考虑时区、闰年、夏令时和许多极端情况。有一个enlightening video from the talk by Taavi Burns at PyCon2012 题为“关于日期时间你需要知道的事情”:

    What you need to know about datetimes:
    标准库中的timedatetimecalendar 有点乱。了解:在哪里使用什么以及如何使用(特别是当您有多个时区的用户时),以及您可能想要研究哪些额外的模块。

    活动:PyCon US 2012 / 演讲者:Taavi Burns / 录制:2012 年 3 月 10 日

    使用时区感知日期时间进行计算

    明天的datetime.time 的概念是无效的,因为datetime.time 缺少任何日期信息。在比较之前,您可能希望将所有内容都转换为时区感知 datetime.datetime

    def time_in_range(start, end, x):
        today = timezone.localtime().date()
        start = timezone.make_aware(datetime.datetime.combine(today, start))
        end = timezone.make_aware(datetime.datetime.combine(today, end))
        x = timezone.make_aware(datetime.datetime.combine(today, x))
        if end <= start:
            end += datetime.timedelta(days=1) # tomorrow!
        if x <= start
            x += datetime.timedelta(days=1) # tomorrow!
        return start <= x <= end
    

    【讨论】:

    • 谢谢。我没有测试,但你的解释对我来说很清楚。早上好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多