web-dev-qa-db-ja.com

Pythonの日付範囲に対する日付の確認

日付変数があります:2011-01-15そして、日付が今日から3日以内であれば、ブール値を取得したいと思います。 Pythonでこれを構築する方法はよくわかりません。日付ではなく日付のみを扱っています。

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

私はあなたがPythonの日付モジュールでいくつかの凝った/複雑なことをすることができることを知っていますが、どこを見ればいいのか分かりません。

45
Flowpoke

Pythonで範囲を確認するには、a <= x <= b

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

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

2つのdateオブジェクトを減算すると、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

「どこを見るか」について:公式の ドキュメント は素晴らしいです。

8
Thomas

他の人はすでに十分に答えているので、この答えに投票する必要はありません。
(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 __== "__main__":
    import doctest
    doctest.testmod()
5
bernie

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

import datetime

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

    def __contains__(self, dt):
        return self._dt1 < dt < self._dt2

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
4
mdornfe1