如何检查是否当前时间是在范围内的蟒蛇?如何检查是否当前时间是在范围内的蟒蛇?(How to chec

2019-05-14 12:44发布

我需要检查,如果当前时间是在TIMERANGE。 最简单的情况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'是在反向范围如['23:00', '01:00']

Answer 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.timestartend ,和x

>>> 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


Answer 2:

对于明天datetime.time的概念是无效的,因为datetime.time不能代表这个信息。 你应该一切都转换为datetime.datetime比较之前:

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

涉及日期/时间的计算是非常棘手的,有一个从PyCon2012谈话由Taavi伯恩斯启发性的视频 ,题为“你需要了解什么日期时间”:

你需要了解什么日期时间
timedatetimecalendar从标准库是有点乱。 了解:用什么在哪里以及如何(特别是当你在许多时区的用户),你可能想看看有什么额外的模块。

事件 :美国PYCON 2012 / 音箱 :Taavi烧伤/ 记录 :2012年3月10日



文章来源: How to check if the current time is in range in python?