I need to check if the current time is in timerange. The most simple case time_end > time_start:
if time(6,0) <= now.time() <= time(12,00): print '1'
But troubles begin when user enters a time range when the end time is smaller than the start time, e.g. "23:00 - 06:00". A time like '00:00' will be in this range. About 5 years ago I wrote this PHP function:
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;
}
Now I need to do the same thing, but I want to make it good looking. So, what algorithm should I use to determine if the current time '00:00' is in reversed range e.g. ['23:00', '01:00']
?
The Python solution is going to be much, much shorter.
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
Use the datetime.time
class for start
, end
, and 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
The concept of a datetime.time for tomorrow is void, because datetime.time can't represent this information. You should convert everything to datetime.datetime before comparing:
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
Calculations involving date/time can be very tricky, there is an enlightening video from the talk by Taavi Burns at PyCon2012 entitled "What you need to know about datetimes":
What you need to know about datetimes:
time
,datetime
, andcalendar
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
来源:https://stackoverflow.com/questions/10747974/how-to-check-if-the-current-time-is-in-range-in-python