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

例如:

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

谢谢

236741 次浏览

我想到了这个:

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

你的问题要求在两者之间的日期,但我相信你的意思是包括开始和结束点,所以它们包括在内。若要删除结束日期,请删除“;+ 1”;在range函数的末尾。若要删除开始日期,请在range函数的开头插入一个1参数。

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)
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()

使用列表推导式:

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)

本质上与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