打印两个日期之间的所有日期[重复]

Posted

技术标签:

【中文标题】打印两个日期之间的所有日期[重复]【英文标题】:Print all day-dates between two dates [duplicate] 【发布时间】:2011-11-08 14:39:30 【问题描述】:

例如:

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

谢谢

【问题讨论】:

看看***.com/questions/1060279/… 【参考方案1】:

我想出了这个:

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 函数的开头插入一个 1 参数。

【讨论】:

大家好,我试过了,但它只打印最后一天,我需要完整的列表日 dates_list = [] result = d1 + td(days=i) dates_list.append(result) print(result ) 它只打印最后一天,如何解决这个问题? 听起来你的循环在某种程度上是错误的。请回复您range(delta.days)的值。 带天数的时间增量总是加上 24 小时的倍数。因此,如果您切换到夏令时,您将关闭一小时(每个时间为凌晨 1 点)。往另一个方向走,你甚至会有不同的一天,每天晚上 11 点。使用 UTC 的原因之一... 这使用了 Date 类,所以时间不是一个因素。 @RSJohn,查找python strftime。如果您不介意date.isoformat() 之间的破折号是最好的方法。【参考方案2】:

使用列表推导:

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)

【讨论】:

【参考方案3】:

与 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

【讨论】:

我更喜欢生成器的想法,它总是可以是代码中某处的辅助函数;但是,它肯定缺乏类型和完整性检查。 startend args 默认设置为 None 正在询问错误。 for i in xrange(span.days + 1): 导致错误,必须将其更改为 or i in range(span.days + 1): 另一个答案是 Python 3 上的生成器,这个 Python 2 代码现在已经过时了。【参考方案4】:
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()

【讨论】:

【参考方案5】:
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)

【讨论】:

以上是关于打印两个日期之间的所有日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP:返回数组中两个日期之间的所有日期[重复]

创建两个日期之间所有日期的数组或列表[重复]

编写一个查询,该查询将在两个设定日期之间运行所有日期和日期的名称[重复]

计算SQL中两个日期之间的月数[重复]

如何找到两个日期之间的天数差异[重复]

具有相同时区信息的两个python日期时间对象的打印方式不同[重复]