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']?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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
Method 2
Date/time is trickier than you think
Calculations involving date/time can be very tricky because you must consider timezone, leap years, day-light-savings and lots of corner cases. 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, andcalendarfrom 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
Use timezone-aware datetime for calculations
The concept of a datetime.time for tomorrow is void, because datetime.time lacks any date information. You probably want to convert everything to timezone-aware datetime.datetime before comparing:
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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0