You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Python列表最后一项的日期不超过指定结束日期

问题:生成日期段列表时限制结束日期不超过设定值

需求:基于给定起止日期,创建按30天递增的日期段列表,要求最后一段的结束日期不得超过设定的结束日期,但当前代码生成的结果超出了结束日期,需修正。

原代码

from datetime import timedelta, date

start_date = date(2021,1,1)
end_date = date(2021,6,30)

n = 30

next_date = start_date
res = []

while start_date < end_date:
    next_date = (start_date + timedelta(n))
    next_date_str = next_date.strftime('%Y-%m-%d')
    var = start_date.strftime('%Y-%m-%d')+'#'+next_date_str

    res.append(var)
    start_date = next_date + timedelta(1)

print(res)

实际输出

['2021-01-01#2021-01-31', '2021-02-01#2021-03-03', '2021-03-04#2021-04-03', '2021-04-04#2021-05-04', '2021-05-05#2021-06-04', '2021-06-05#2021-07-05']

期望输出

['2021-01-01#2021-01-31', '2021-02-01#2021-03-03', '2021-03-04#2021-04-03', '2021-04-04#2021-05-04', '2021-05-05#2021-06-04', '2021-06-05#2021-06-30']

修正方案

核心是每次计算结束日期时,取30天后的日期和设定的结束日期中的较小值,避免超出范围;同时调整循环逻辑,确保最后一段生成后及时终止循环。

修正后的代码:

from datetime import timedelta, date

start_date = date(2021,1,1)
end_date = date(2021,6,30)

n = 30

res = []

current_start = start_date
while current_start <= end_date:
    # 计算当前段的结束日期,取30天后和end_date的较小值
    current_end = min(current_start + timedelta(days=n), end_date)
    # 生成日期段字符串
    date_segment = f"{current_start.strftime('%Y-%m-%d')}#{current_end.strftime('%Y-%m-%d')}"
    res.append(date_segment)
    # 如果已经到了结束日期,终止循环
    if current_end == end_date:
        break
    # 下一段的起始日期是当前结束日期+1天
    current_start = current_end + timedelta(days=1)

print(res)

修正说明

  1. 替换原循环中的start_date为current_start,避免修改原始变量,逻辑更清晰;
  2. 用min()函数限制current_end的最大值为end_date,确保不会超出设定范围;
  3. 添加判断:当current_end等于end_date时直接终止循环,避免无效的后续计算;
  4. 循环条件改为current_start <= end_date,确保最后一段(起始日期在end_date之前或当天)能被正确生成。

内容的提问来源于stack exchange,提问作者vvazza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:25:15