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

264 投票
5 回答
264613 浏览
提问于 2025-04-17 01:07

例如:

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

谢谢

5 个回答

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

我想出了这个:

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”删掉。如果想去掉开始日期,可以在范围函数的开头加一个1作为参数。

撰写回答