如何在Python中计算两个日期之间的天数总和

3 投票
7 回答
21411 浏览
提问于 2025-04-16 23:30

比如说:

date 1 : 1 january 2000  
date 2 : 17 november 2006  

我想知道在2000年到2006年之间,日期1和日期2之间有多少天。所以我需要一个能返回类似这样的结果的东西(不管是列表还是其他形式):
2000年:365天,2001年:365天,……,2006年:320天

我在网上找过类似的东西,但只找到了一些计算两个日期之间天数、月份或年份的方法。

7 个回答

4

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个函数时,发现它的表现和预期不一样。这种情况可能是因为我们没有正确地传递参数,或者是对这个函数的使用方法不够了解。

此外,调试代码也是一个很重要的技能。调试就是找出代码中出错的地方,然后修正它。很多时候,我们需要仔细查看错误信息,这些信息通常会告诉我们出错的行数和原因。通过这些提示,我们可以一步步找到问题所在。

总之,编程是一门需要不断学习和实践的技能。遇到问题时,不要气馁,仔细分析,寻找解决方案,慢慢就会变得越来越熟练。

from datetime import date

DATE_END = date(2006, 11, 17)

def get_days(date_start):
    return (DATE_END - date_start).days

starting_dates = [
    date(2000, 1, 1),
    date(2001, 1, 1),
    date(2002, 1, 1),
]

print map(get_days, starting_dates)
6
>>> start_date = datetime.datetime(2006, 7, 3)
>>> end_date = datetime.datetime(2012, 12, 21)
>>> years = range(start_date.year, end_date.year + 1)
>>> start, end = start_date, end_date + datetime.timedelta(1)
>>> for year in years:
...     year_start = datetime.datetime(year, 1, 1, 0, 0)
...     year_end = datetime.datetime(year + 1, 1, 1, 0, 0)
...     print(year, min(end, year_end) - max(start, year_start))
... 
2006 182 days, 0:00:00
2007 365 days, 0:00:00
2008 366 days, 0:00:00
2009 365 days, 0:00:00
2010 365 days, 0:00:00
2011 365 days, 0:00:00
2012 356 days, 0:00:00

更新:你可能需要在结束日期后加上一个 datetime.timedelta(1),因为如果不加的话,最后一天会算错。这个问题已经修正了。不过这要看你是想把最后一天算进去还是不算进去。

8

嗯,可以试试这样做:

import datetime, calendar
date1 = datetime.date(year1, month1, day1) # month and day are 1-base
date2 = datetime.date(year2, month2, day2)
days_in_first_year = (datetime.date(year1,12,31)-date1).days
days_in_last_year = (date2 - datetime.date(year2, 1, 1)).days
if year1 != year2:
    n_days_list = [days_in_first_year]
    for year in range(year1+1, year2): n_days_list.append(365 + (1*calendar.isleap(year)))
    n_days_list.append(days_in_last_year)
else: n_days_list = [days_in_first_year + days_in_last_year]

这个我还没测试过,可能会有一些越界错误;确保它的结果是你想要的。

补充:修正一下range()函数的边界,正确处理year1等于year2的情况。

撰写回答