如何在Python中检查当前时间是否在范围内?

2024-09-25 04:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要检查当前时间是否在时间范围内。最简单的案例时间结束时间开始时间:

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


Tags: falsetruereturniftime时间dtstart
2条回答

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

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

涉及日期/时间的计算可能非常棘手,因为您必须考虑时区、闰年、日光节约和许多角落情况。有一个enlightening video from the talk by Taavi Burns at PyCon2012题为“您需要了解的日期时间”:

What you need to know about datetimes:
time, datetime, and calendar from the standard library are a bit messy. Find out: what to use where and how (particularly when you have users in many timezones), and what extra modules you might want to look into.

Event: PyCon US 2012 / Speakers: Taavi Burns / Recorded: March 10, 2012

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

明天的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

相关问题 更多 >