【问题标题】:timedelta returning wrong monthtimedelta 返回错误的月份
【发布时间】:2016-10-27 23:24:28
【问题描述】:

我编写了一些代码来向 API 发送请求。 API 允许在给定的一组日期之间执行搜索。我的代码采用一个 datetime 对象并将该对象增加一个 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

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

知道为什么会这样吗?

【问题讨论】:

  • 尝试使用 freeze_gun 库进行单元测试,以便进行调试。让您轻松模拟当前日期/时间
  • 您正在计算下一部分的第一天的月份,但减去一个天。尝试使用final_day = d-timedelta(days=1) ; ye=final_day.strftime("%Y")... etc。
  • 是的,你是对的我现在看到了我的错误,在我减去一天之后整个时间对象发生了变化,但是之前定义为字符串的月份和年份没有。

标签: python python-2.7 python-datetime


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-16
      • 2014-12-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多