timedelta 返回错误的月份
timedelta returning wrong month
我写了一些代码来向 API 发送请求。 API 允许在给定的一组日期之间执行搜索。我的代码采用一个日期时间对象并将该对象增加一个 timedelta,我们称这个 timedelta d。我有第二个日期时间对象,它递增 d-1。这个想法是获得不重叠的时间段。一切似乎都工作正常,除了当日期从 11 月 1 日变回 10 月 31 日时,我的日期时间返回的月份不正确。这是代码:
start_date=datetime(2013,9,22)
end_date=datetime(2013,12,1)
d = start_date
delta = timedelta(days=10)
while d <= end_date:
ys=d.strftime('%Y')
ms=d.strftime('%m')
ds=d.strftime('%d')
d += delta
ye=d.strftime('%Y')
me=d.strftime('%m')
de=(d-timedelta(days=1)).strftime('%d')
print ys+'-'+ms+'-'+ds+'..'+ye+'-'+me+'-'+de
这里是 output:2013-09-22..2013-10-01
2013-10-02..2013-10-11
2013-10-12..2013-10-21
2013-10-22..2013-11-31 #the second date printed should be 2013-10-31
2013-11-01..2013-11-10
2013-11-11..2013-11-20
2013-11-21..2013-12-30
2013-12-01..2013-12-10
知道为什么会这样吗?
尝试在所有 ye
、me
和 de
上使用 d-timedelta(days=1)
,而不仅仅是 de
执行后:
d += delta
然后 d
表示下一个时间间隔的开始日期,在您的数据中的一种情况下是 2013-11-01
所以当您获得该数据的年份和月份时,您会得到 2013-11
然后获取前一天的日期 2013-10-31
所以它获取 31
而不是获取前一天的所有三个字段:
end_interval=d-timedelta(days=1)
ye = end_interval.strftime('%Y')
me=end_interval.strftime('%m')
de=(end_interval).strftime('%d')
print(ys+'-'+ms+'-'+ds+'..'+ye+'-'+me+'-'+de)
或者更简洁地说,您可以使用 strftime('%Y-%m-%d')
一次获取所有三个字段。
start_str = d.strftime("%Y-%m-%d")
d += delta
end_str = (d-timedelta(days=1)).strftime("%Y-%m-%d")
print(start_str+'..'+end_str)
甚至更简洁:
start_date=datetime(2013,9,22)
end_date=datetime(2013,12,1)
d = start_date
delta = timedelta(days=10)
interval = delta - timedelta(days=1) #the difference between the start of an interval and the last day
while d <= end_date:
end = d+interval #last day of interval
print("{:%Y-%m-%d}...{:%Y-%m-%d}".format(d, end))
d = end + timedelta(days=1) #set d to one day more then the end of interval
我写了一些代码来向 API 发送请求。 API 允许在给定的一组日期之间执行搜索。我的代码采用一个日期时间对象并将该对象增加一个 timedelta,我们称这个 timedelta d。我有第二个日期时间对象,它递增 d-1。这个想法是获得不重叠的时间段。一切似乎都工作正常,除了当日期从 11 月 1 日变回 10 月 31 日时,我的日期时间返回的月份不正确。这是代码:
start_date=datetime(2013,9,22)
end_date=datetime(2013,12,1)
d = start_date
delta = timedelta(days=10)
while d <= end_date:
ys=d.strftime('%Y')
ms=d.strftime('%m')
ds=d.strftime('%d')
d += delta
ye=d.strftime('%Y')
me=d.strftime('%m')
de=(d-timedelta(days=1)).strftime('%d')
print ys+'-'+ms+'-'+ds+'..'+ye+'-'+me+'-'+de
这里是 output:2013-09-22..2013-10-01
2013-10-02..2013-10-11
2013-10-12..2013-10-21
2013-10-22..2013-11-31 #the second date printed should be 2013-10-31
2013-11-01..2013-11-10
2013-11-11..2013-11-20
2013-11-21..2013-12-30
2013-12-01..2013-12-10
知道为什么会这样吗?
尝试在所有 ye
、me
和 de
上使用 d-timedelta(days=1)
,而不仅仅是 de
执行后:
d += delta
然后 d
表示下一个时间间隔的开始日期,在您的数据中的一种情况下是 2013-11-01
所以当您获得该数据的年份和月份时,您会得到 2013-11
然后获取前一天的日期 2013-10-31
所以它获取 31
而不是获取前一天的所有三个字段:
end_interval=d-timedelta(days=1)
ye = end_interval.strftime('%Y')
me=end_interval.strftime('%m')
de=(end_interval).strftime('%d')
print(ys+'-'+ms+'-'+ds+'..'+ye+'-'+me+'-'+de)
或者更简洁地说,您可以使用 strftime('%Y-%m-%d')
一次获取所有三个字段。
start_str = d.strftime("%Y-%m-%d")
d += delta
end_str = (d-timedelta(days=1)).strftime("%Y-%m-%d")
print(start_str+'..'+end_str)
甚至更简洁:
start_date=datetime(2013,9,22)
end_date=datetime(2013,12,1)
d = start_date
delta = timedelta(days=10)
interval = delta - timedelta(days=1) #the difference between the start of an interval and the last day
while d <= end_date:
end = d+interval #last day of interval
print("{:%Y-%m-%d}...{:%Y-%m-%d}".format(d, end))
d = end + timedelta(days=1) #set d to one day more then the end of interval