37

現在の時刻が timerange 内にあるかどうかを確認する必要があります。最も単純なケース time_end > time_start:

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']ですか?

4

2 に答える 2

57

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
于 2012-05-25T03:12:35.107 に答える
12

日付/時刻はあなたが思っているよりも複雑です

タイムゾーン、うるう年、夏時間、および多くの特殊なケースを考慮する必要があるため、日付/時刻を含む計算は非常に難しい場合があります。PyCon2012 での Taavi Burns による「日時について知っておくべきこと」というタイトルの講演からの啓発的なビデオがあります。

標準ライブラリの datetimes :
timedatetime、およびについて知っておくべきこと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
于 2012-05-25T03:13:12.090 に答える