【问题标题】:Checking date against date range in Python在 Python 中根据日期范围检查日期
【发布时间】:2011-06-09 09:33:34
【问题描述】:

我有一个日期变量:2011-01-15,如果所述日期在今天后 3 天内,我想返回一个布尔值。我不太确定如何在 Python 中构造它。我只处理日期,而不是日期时间。

我的工作示例是“宽限期”。用户登录我的网站,如果宽限期在今天的 3 天内,则该用户的其他脚本等将被省略。

我知道你可以在 Python 的日期模块中做一些花哨/复杂的事情,但我不知道去哪里找。

【问题讨论】:

    标签: python datetime date time boolean


    【解决方案1】:

    在 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
    

    【讨论】:

    • 给马克拜尔斯的分数。我同意,对托马斯的回答更具可读性但同样有效。谢谢你们俩。我已将这两种方法添加到我的日记中。很有道理。
    【解决方案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
    

    至于“看哪里”:官方documentation很好。

    【讨论】:

    • 我在 Python 3.1.3 中尝试过这个,并在使用 01 表示 1 月与使用 1 表示 1 月时得到“语法错误:无效令牌”。仍然给你#1虽然......:)
    • 哦,对不起。 Python 2 会将其解释为八进制,但他们在 Python 3 中放弃了这种语法,因为它令人困惑。我总是用八进制写我的日期,不是吗? ;)
    • 我是新人学习Python,所以我不知道我在做什么。我欢迎四面八方!这就是为什么我每天都来SO。
    【解决方案3】:

    面向对象的解决方案

    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
    

    【讨论】:

    • 我喜欢你的解决方案,但我认为范围应该是包容性的,所以使用 lessorequal:
    【解决方案4】:

    其他人的回答已经足够充分,因此无需对此答案投票。
    (使用 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()
    

    【讨论】:

    • 我也喜欢这个。我喜欢对下部和上部的支持,因为我可能不想在今天之前数天。完成 doctest! ;)
    【解决方案5】:

    将经过的时间转换为天数,然后对经过的天数应用三元运算

    current_dt=datetime.now()
    feed_dt = datetime.now()-timedelta(days=3)
    from_dt=datetime(year=feed_dt.year,month=feed_dt.month,day=feed_dt.day)
    days_elapsed=(current_dt-from_dt).days
    print(True if days_elapsed <=3 else False)
    

    输出: 是的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多