timedelta错误地返回了一个月

时间:2016-10-27 15:08:17

标签: python python-2.7 python-datetime

我写了一些代码来向API发送请求。 API允许在给定的一组日期之间执行搜索。我的代码获取一个datetime对象并通过timedelta增加该对象,让我们调用此timedelta d。我有第二个日期时间对象,它增加了d-1。想法是获得非重叠的时间段。一切似乎工作正常,但是当日期从11月第一次更改回到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

这是输出: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

有关为何发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

执行完毕后

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

答案 1 :(得分:0)

尝试在所有d-timedelta(days=1)yeme上使用de,而不仅仅是de