2011-01-14 30 views
30

日付変数:2011-01-15があります。日付が今日から3日以内の場合はブール値を戻したいと考えています。私はPythonでこれをどのように構築するのかはかなり分かりません。私はdatetimeではなくdateを扱っています。日付をPythonの日付範囲と比較する

私の動作例は「猶予期間」です。ユーザーが自分のサイトにログインし、猶予期間が今日から3日以内であれば、そのユーザーに対して追加のスクリプトなどが省略されます。

私はあなたがPythonの日付モジュールでいくつかの幻想的な/複雑なことをすることができますが、どこに見えるか分からないことを知っています。

答えて

78

>>> import datetime 
>>> today = datetime.date.today() 
>>> margin = datetime.timedelta(days = 3) 

>>> today - margin <= datetime.date(2011, 1, 15) <= today + margin 
True 
+3

+1私よりもはるかに読みやすい。 – Thomas

+0

Mark Byersに与えられたポイント。私は同意し、より読みやすいが、トーマスの答えにも同様に有効である。あなたがた両方に感謝します。私は私の日記に両方の方法を加えました。完璧な意味合いを持つ。 – Flowpoke

+0

ありがとう..パーフェクト..まさに私が探していたもの.. !! –

7

dateオブジェクトを2つ減算すると、timedeltaオブジェクトが得られます。このオブジェクトは、他のtimedeltaオブジェクトと比較できます。例えば

: "どこを見れする" については

>>> from datetime import date, timedelta 
>>> date(2011, 1, 15) - date.today() 
datetime.timedelta(1) 
>>> date(2011, 1, 15) - date.today() < timedelta(days = 3) 
True 
>>> date(2011, 1, 18) - date.today() < timedelta(days = 3) 
False 

:公式documentation性が優れています。あなたがa <= x <= bを使用できる範囲を確認するためのPythonで

+0

私は、Python 3.1.3でこれを試してみましたが、取得:1月のための1を使用して対1月のために01を使用しているとき「にSyntaxError無効なトークンを」。 まだあなたに#1を与えています... :) – a2j

+0

ああ、申し訳ありません。 Python 2ではこれを8進数として解釈しますが、Python 3ではこの構文を混乱させてしまいました。私は常に私の日付を8進数で書いていますね。 ;) – Thomas

+0

私はPythonを習得していないので、自分が何をしているのか分かりません。私はすべての方向を歓迎する!だから私は毎日そんなに来るのですか? – a2j

5

その他は十分に答えよりも、すでに多くを持っていないので、この回答に投票する必要。
(Mark Byersのanswerに示されている手法を使用して+1)

import datetime as dt 

def within_days_from_today(the_date, num_days=7): 
    ''' 
     return True if date between today and `num_days` from today 
     return False otherwise 

     >>> today = dt.date.today() 
     >>> within_days_from_today(today - dt.timedelta(days=1), num_days=3) 
     False 
     >>> within_days_from_today(dt.date.today(), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=1), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=2), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=3), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=4), num_days=3) 
     False 
    ''' 
    lower_limit = dt.date.today() 
    upper_limit = lower_limit + dt.timedelta(days=num_days) 
    if lower_limit <= the_date <= upper_limit: 
     return True 
    else: 
     return False 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
+0

私もこれが好きです。私は今日までの日数を数えたくないかもしれないので、下と上のサポートが好きです。 doctestで完了! ;) – Flowpoke

0

オブジェクト指向ソリューション

import datetime 

class DatetimeRange: 
    def __init__(self, dt1, dt2): 
     self.dt1 = dt1 
     self.dt2 = dt2 

    def __contains__(self, dt): 

     if dt > dt1 and dt < dt2: 
      return True 
     else: 
      return False 

dt1 = datetime.datetime.now() 
dt2 = dt1 + datetime.timedelta(days = 2) 
test_true = dt1 + datetime.timedelta(days = 1) 
test_false = dt1 + datetime.timedelta(days = 5) 

test_true in DatetimeRange(dt1, dt2) #Returns True 
test_false in DatetimeRange(dt1, dt2) #Returns False