如何判断一个日期时间是否超过x个月在Python中

1 投票
3 回答
4797 浏览
提问于 2025-04-18 11:03

我想知道某个条目在过去的6个月内是否被更新过。

这是我尝试过的代码:

 def is_old(self):
        """
        Is older than 6 months (since last update)
        """
        time_threshold = datetime.date.today() - datetime.timedelta(6*365/12)
        if self.last_update < time_threshold:
            return False
        return True

但是我遇到了这个错误:

    if self.last_update < time_threshold:
TypeError: can't compare datetime.datetime to datetime.date

3 个回答

1

你可以使用一个外部模块叫做 dateutil

from dateutil.relativedelta import relativedelta

def is_old(last_update):
    time_threshold = date.today() - relativedelta(months=6)
    return last_update < time_threshold

这是假设 last_update 的类型是一个 date 对象。

1

你的数据库字段 last_update 是一个日期时间类型的字段,而你却在用日期来比较它,这就是出错的原因。你应该用 datetime.datetime.now() 来代替 datetime.date.today()。更好的做法是使用 django.utils.timezone,这样可以遵循你设置中的 TIME_ZONE

from django.utils import timezone

def is_old(self):
    """
    Is older than 6 months (since last update)
    """
    time_threshold = timezone.now() - datetime.timedelta(6*365/12)
    return bool(self.last_update > time_threshold)
5

你需要使用 days 这个关键词

>>> import datetime
>>> datetime.date.today() - datetime.timedelta(days=30)
datetime.date(2014, 5, 26)
>>> datetime.date.today() - datetime.timedelta(days=180)
datetime.date(2013, 12, 27)
>>> datetime.date.today() - datetime.timedelta(days=6*365/12)
datetime.date(2013, 12, 25)

还有,关于你遇到的错误: TypeError: can't compare datetime.datetime to datetime.date

你可以这样做

def is_old(self):

    time_threshold = datetime.date.today() - datetime.timedelta(days=6*365/12)

    #The following code can be simplified, i shall let you figure that out yourself. 
    if self.last_update and self.last_update.date() < time_threshold:
        return False
    return True

撰写回答