現在の時刻がタイムレンジにあるかどうかを確認する必要があります。最も単純なケースtime_end> time_start:
if time(6,0) <= now.time() <= time(12,00): print '1'
しかし、ユーザーが終了時刻が開始時刻よりも短い時間範囲に入ると、問題が発生します。 「23:00-06:00」。 「00:00」のような時間はこの範囲になります。約5年前に私はこれを書きました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;
}
同じことをする必要がありますが、見栄えを良くしたいです。したがって、現在の時刻「00:00」が逆転の範囲内にあるかどうかを判断するためにどのアルゴリズムを使用する必要がありますか。 ['23:00', '01:00']
?
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
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
タイムゾーン、うるう年、夏時間、および多くのコーナーケースを考慮する必要があるため、日付/時刻を含む計算は非常に難しい場合があります。 PyCon2012でのTaavi Burnsによる講演からの啓蒙ビデオ 「日時について知っておくべきこと」と題されています:
日時について知っておくべきこと :
time
、datetime
、および標準ライブラリのcalendar
は少し厄介です。何をどこでどのように使用するか(特に、多くのタイムゾーンにユーザーがいる場合)、および調査したい追加のモジュールを見つけます。イベント:PyCon US 2012 /スピーカー:Taavi Burns /記録済み:2012年3月10日
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