如何在Python中比较日期和日期时间?

73 投票
6 回答
155747 浏览
提问于 2025-04-16 01:30

我这里有一段小代码,我想执行一下:

>>> from datetime import *
>>> item_date = datetime.strptime('7/16/10', "%m/%d/%y")
>>> from_date = date.today()-timedelta(days=3)
>>> print type(item_date)
<type 'datetime.datetime'>
>>> print type(from_date)
<type 'datetime.date'>
>>> if item_date > from_date:
...     print 'item is newer'
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare datetime.datetime to datetime.date

我好像无法比较日期和日期时间的值。比较这两者的最佳方法是什么呢?我应该把日期时间转换成日期,还是反过来?我该怎么在它们之间转换呢?

(这个问题虽然小,但似乎有点让人困惑。)

6 个回答

6

这里有另一种方法,可以在两个输入都是日期时间(datetime)而不是单纯的日期(date)时保留信息。这是从一个评论中“借用”的,评论地址在无法比较datetime.datetime和datetime.date。你可以使用下面的方式把日期转换成日期时间:

datetime.datetime(d.year, d.month, d.day)

建议:

from datetime import datetime

def ensure_datetime(d):
    """
    Takes a date or a datetime as input, outputs a datetime
    """
    if isinstance(d, datetime):
        return d
    return datetime.datetime(d.year, d.month, d.day)

def datetime_cmp(d1, d2):
    """
    Compares two timestamps.  Tolerates dates.
    """
    return cmp(ensure_datetime(d1), ensure_datetime(d2))
7

我想比较一些日期,这些日期是以字符串的形式表示的,比如'20110930'

benchMark = datetime.datetime.strptime('20110701', "%Y%m%d") 

actualDate = datetime.datetime.strptime('20110930', "%Y%m%d")

if actualDate.date() < benchMark.date():
    print True
116

使用 这个 .date() 方法 可以把一个日期时间转换成只有日期的部分:

if item_date.date() > from_date:

另外,你也可以用 datetime.today() 来代替 date.today()。你可以使用

from_date = from_date.replace(hour=0, minute=0, second=0, microsecond=0)

来在之后去掉时间部分。

撰写回答