Python:两个日期时间相差几个月

44 投票
4 回答
68948 浏览
提问于 2025-04-16 23:18

可能是重复的问题:
在Python中找到两个日期之间的月份的最佳方法

我想知道如何准确计算两个日期之间的月份差:

date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S')
date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d')

date2减去date1的结果是

datetime.timedelta(183, 43200)

我想知道确切的月份数,在这个例子中应该返回5而不是6(因为涉及到小时的原因)

4 个回答

29

只有你自己知道你需要满足什么样的要求,但在这两个日期之间有183天和43200个SI秒,这就说明了在确定“真的有多少个月”这个问题上,存在一种主观性。

一个月是30天,还是(365 / 12)天,还是((365 * 4 + 1)/ 48)天,还是其他的呢?

一天总是86400秒吗?还是要考虑历史上的闰秒,或者预测未来的闰秒?

这些选择会影响你想要的算法在处理接近这些边界的特定输入日期时给出的答案。

在我看来,把月份看作时间的基本单位会更直观,可以用这个公式来计算:(date2.year - date1.year) * 12 + (date2.month - date1.month)

86

你可以使用 python-dateutil 这个库。

In [4]: from datetime import datetime

In [5]: date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S')

In [6]: date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d')

In [7]: from dateutil import relativedelta

In [8]: r = relativedelta.relativedelta(date1, date2)

In [9]: r
Out[9]: relativedelta(months=-5, days=-30, hours=-12)
26

使用 calendar 模块来找出每个月有多少天,你只需要简单地数一下月份就可以了。

from calendar import monthrange
from datetime import datetime, timedelta

def monthdelta(d1, d2):
    delta = 0
    while True:
        mdays = monthrange(d1.year, d1.month)[1]
        d1 += timedelta(days=mdays)
        if d1 <= d2:
            delta += 1
        else:
            break
    return delta

撰写回答