Python中年和日(无月)中的日期差异

时间:2018-06-30 06:39:16

标签: python

我有两个约会:2005/04/10和2018/02/11。

以下代码按年,月和日计算差异:

from datetime import datetime
from dateutil.relativedelta import relativedelta
start_date = datetime(2005,4,10)
end_date = datetime(2018,2,11)
difference = relativedelta(end_date, start_date)
print(difference.years)
print(difference.months)
print(difference.days)

输出为:

12
10
1

12年10个月零1天。问题是我对几个月不感兴趣,只希望在几天和几天之内。在我的示例中,应该是12年零306天。我知道一个很好的近似值是10个月* 30 = 300天,但结果是301,而不是306。我要精确计算出考虑leap日和每个月的天数差异的天数。 Python中有内置方法可以做到这一点吗?

看起来我已经对StackOverflow进行了研究,以找到答案,但是与我的问题相关的所有问题都无法解决我的问题。

2 个答案:

答案 0 :(得分:3)

在编写完代码之后,执行以下操作:

mid_date = datetime(start_date.year + difference.years, start_date.month, start_date.day)
print((end_date - mid_date).days)

您的示例输入为307。

该想法是将原始start_date偏移difference.years,以避免重复计算差异的那一部分。

答案 1 :(得分:0)

由于约翰的评论,我编写了这段代码,我认为它满足了我的要求:

from datetime import datetime
from dateutil.relativedelta import relativedelta

start_date = datetime(2005,4,10)
end_date = datetime(2018,2,11)      
difference = relativedelta(end_date, start_date)

remaining_days = 0
if  start_date != datetime(start_date.year, 1, 1):
    end_first_year = datetime(start_date.year, 12, 31)
    remaining_days += (end_first_year - start_date).days
if  end_date != datetime(start_date.year, 1, 1):
    begin_last_year = datetime(end_date.year, 1, 1)
    remaining_days += (end_date - begin_last_year).days
print(difference.years)
print(remaining_days)

这将精确地剩余306天。 谁能建议一个不太冗长的代码段?