两个日期之间的天数?

169

如何最快地计算出两个日期之间经过了多少完整的天数?以下是我目前正在使用的方法。

math.floor((b - a).total_seconds()/float(86400))

1
只是两个日期,还是它们也包括时间信息? - Sven Marnach
1
啊——请参见https://dev59.com/jnVC5IYBdhLWcg3w51hv。 - Paul D. Waite
date1 = date(2018,7,3) date2 = date(2018,9,29) days = (date2-date1).days # 已经计算出天数print("总共 {} 周零 {} 天".format(days//7, days%7)); - Rajeev Singla
4个回答

300

假设您确实有两个日期对象,您可以将一个日期对象从另一个日期对象中减去,并查询生成的timedelta对象中的天数:

>>> from datetime import date
>>> a = date(2011,11,24)
>>> b = date(2011,11,17)
>>> a-b
datetime.timedelta(7)
>>> (a-b).days
7

而且它也适用于日期时间——我认为它会向下舍入到最接近的一天:

>>> from datetime import datetime
>>> a = datetime(2011,11,24,0,0,0)
>>> b = datetime(2011,11,17,23,59,59)
>>> a-b
datetime.timedelta(6, 1)
>>> (a-b).days
6

2
很酷。我总是认为“天”只是指时间差的一天部分。所以例如2010年和2011年之间的差异将是0天和1年,但事实证明它确实报告了我想要的365天。 - Bemmu
1
@Bemmu:啊,是的 - 我认为 timedelta 不会报告超过天数的任何单位(尽管我可能错了)。 - Paul D. Waite
1
我正在计算几个小时之间的时间差,例如第1天23点和第2天01点之间的时间差。在这些情况下,timedelta返回了0,这不是我想要的。我正在寻找日期差异。作为解决方案,我将datetime转换为date,它按照我期望的方式工作! - ftoyoshima

47

您是指完整的日历天数,还是24小时的时间段?

如果只是24小时,假设您正在使用Python的datetime,则timedelta对象已经有一个days属性:timedelta

days = (a - b).days

对于日历天数,您需要将a向下取整到最近的一天,将b向上取整到最近的一天,并消除两端的不完整天数:

roundedA = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
days = (roundedA - roundedB).days

3
好的地方在于区分日历天数和24小时之间的差异。一个问题是为什么要加1天。我认为上述内容在没有它的情况下已经完美了。 - Matt Alcock
这是计算日历天数的检查。比如,如果A是2013年6月18日16:00,B是2013年6月19日02:00;虽然已经过去了一天,但(B - A).days将返回零,因为时间差仅为10小时。 - DNS
这就是我要表达的观点。你的代码返回2是因为你添加了另外一天。如果不添加1天,它会返回1。为什么要添加一天呢? - Matt Alcock
请查看已更新的代码。 - Matt Alcock
对不起,你是正确的;我不知道为什么会这样做。已更新。 - DNS
a 向下取整,将 b 向上取整 => 对于向上取整的 b,我们需要添加 timedelta(days=1) 是吗?roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0)B 向下取整。roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0) + datetime.timedelta(days=1)b 向上取整。 - avmohan

10

尝试:

(b-a).days

我尝试使用类型为datetime.date的b和a。


6

参考我对其他答案的评论,这是我基于24小时和日历天数计算天数差异的方法。对于24小时来说,"days"属性效果很好,而对于日历检查,函数效果最佳。

from datetime import timedelta, datetime

def cal_days_diff(a,b):

    A = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
    B = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
    return (A - B).days

if __name__ == '__main__':

    x = datetime(2013, 06, 18, 16, 00)
    y = datetime(2013, 06, 19, 2, 00)

    print (y - x).days          # 0
    print cal_days_diff(y, x)   # 1 

    z = datetime(2013, 06, 20, 2, 00)

    print (z - x).days          # 1
    print cal_days_diff(z, x)   # 2 

1
应该是(B - A).days才能得到准确的差异。 - Shift 'n Tab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接