打印两个日期之间的所有日期

263
例如:
from datetime import date

d1 = date(2008,8,15)
d2 = date(2008,9,15)

我正在寻找简单的代码来打印两个日期中间的所有日期:

2008,8,15  
2008,8,16  
2008,8,17  
...  
2008,9,14  
2008,9,15

感谢


4
请访问 https://dev59.com/W3NA5IYBdhLWcg3wL6sc,该页面讨论如何在Python中迭代一段日期范围的问题。 - Mikhail Korobov
5个回答

492

我想到了这个:

from datetime import date, timedelta

start_date = date(2008, 8, 15) 
end_date = date(2008, 9, 15)    # perhaps date.now()

delta = end_date - start_date   # returns timedelta

for i in range(delta.days + 1):
    day = start_date + timedelta(days=i)
    print(day)

输出:

2008-08-15
2008-08-16
...
2008-09-13
2008-09-14
2008-09-15

你的问题要求获取起始日期和结束日期之间的日期,但我认为你想要包括起始日期和结束日期。要删除结束日期,请在range函数末尾删除“+1”。要删除开始日期,在range函数的开头插入1参数。


1
大家好,我尝试了一下,但它只打印最后一天,我需要完整的日期列表。 日期列表 = [] 结果 = d1 + td(days=i) 日期列表.append(结果) print(结果) 它只打印最后一天,如何解决这个问题? - Droid
1
听起来你的循环有些问题。请回复您的 range(delta.days) 的值。 - Gringo Suave
Timedelta 始终会添加 24 小时的倍数。因此,如果您跨越夏令时切换,您会相差一小时(每个都在凌晨1点)。反方向走,您甚至有不同的日期,每个都在晚上11点。使用 UTC 的原因之一... - Jochen
@GringoSuave 如果我想要得到日期列表,例如['20190322','20190323',......],该怎么做?谢谢 :-) - R S John
1
@RSJohn,搜索“python strftime”。如果您不介意在date.isoformat()之间加入破折号,则这是最好的方法。 - Gringo Suave
显示剩余2条评论

58

使用列表推导式:

from datetime import date, timedelta

d1 = date(2008,8,15)
d2 = date(2008,9,15)

# this will give you a list containing all of the dates
dd = [d1 + timedelta(days=x) for x in range((d2-d1).days + 1)]

for d in dd:
    print d

# you can't join dates, so if you want to use join, you need to
# cast to a string in the list comprehension:
ddd = [str(d1 + timedelta(days=x)) for x in range((d2-d1).days + 1)]
# now you can join
print "\n".join(ddd)

19

本质上与Gringo Suave的答案相同,但使用了生成器:

from datetime import datetime, timedelta


def datetime_range(start=None, end=None):
    span = end - start
    for i in xrange(span.days + 1):
        yield start + timedelta(days=i)

然后您可以按以下方式使用它:

In: list(datetime_range(start=datetime(2014, 1, 1), end=datetime(2014, 1, 5)))
Out: 
[datetime.datetime(2014, 1, 1, 0, 0),
 datetime.datetime(2014, 1, 2, 0, 0),
 datetime.datetime(2014, 1, 3, 0, 0),
 datetime.datetime(2014, 1, 4, 0, 0),
 datetime.datetime(2014, 1, 5, 0, 0)]

或者像这样:

In []: for date in datetime_range(start=datetime(2014, 1, 1), end=datetime(2014, 1, 5)):
   ...:     print date
   ...:     
2014-01-01 00:00:00
2014-01-02 00:00:00
2014-01-03 00:00:00
2014-01-04 00:00:00
2014-01-05 00:00:00

1
我更喜欢生成器的想法,它可以始终成为代码中某个地方的helper函数;然而,它确实缺乏类型和健全性检查。将startend参数默认设置为None会引发错误。 - Ramez Ashraf
1
for i in xrange(span.days + 1): is causing errors, had to change it to or i in range(span.days + 1): - LucasSeveryn
另一个答案是Python 3上的生成器,这个Python 2代码现在已经过时了。 - Gringo Suave

8
import datetime

d1 = datetime.date(2008,8,15)
d2 = datetime.date(2008,9,15)
diff = d2 - d1
for i in range(diff.days + 1):
    print (d1 + datetime.timedelta(i)).isoformat()

打印((d1 + datetime.timedelta(i)).isoformat())。 - Vitalii

4
import datetime

begin = datetime.date(2008, 8, 15)
end = datetime.date(2008, 9, 15)

next_day = begin
while True:
    if next_day > end:
        break
    print next_day
    next_day += datetime.timedelta(days=1)

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