nig*_*ler 22 python datetime range
我需要检查当前时间是否在时间范围内.最简单的情况time_end> time_start:
if time(6,0) <= now.time() <= time(12,00): print '1'
Run Code Online (Sandbox Code Playgroud)
但是当用户在结束时间小于开始时间时输入时间范围时开始麻烦,例如"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;
}
Run Code Online (Sandbox Code Playgroud)
现在我需要做同样的事情,但我想让它看起来很好看.那么,我应该使用什么算法来确定当前时间'00:00'是否在相反的范围内,例如['23:00', '01:00']?
Die*_*Epp 39
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
Run Code Online (Sandbox Code Playgroud)
使用datetime.time类start,end和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
Run Code Online (Sandbox Code Playgroud)
明天的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
Run Code Online (Sandbox Code Playgroud)
涉及日期/时间的计算可能非常棘手,有来自PyCon2012的Taavi Burns题为"您需要了解的约会时间" 的演讲的启发性视频:
你需要了解什么日期时间:
time,datetime,并calendar从标准库是有点乱.了解:在何处以及如何使用(特别是当您在许多时区中拥有用户时),以及您可能想要查看的额外模块.活动:PyCon US 2012/演讲者:Taavi Burns/Recorded:2012年3月10日