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

如何用Python datetime获取指定日期区间的yyyy-mm-dd格式日期列表

问题描述

我尝试获取两个yyyy-mm-dd格式日期之间的所有日期,编写了如下代码:

from datetime import datetime, timedelta  # 补充原代码缺失的导入

def date_range(future_date):
    date_list = []
    current = datetime.strptime(datetime.today().strftime('%Y-%m-%d'), '%Y-%m-%d')
    end_dt = future_date
    for n in range(int((end_dt - current).days)+1):
        d = datetime.strftime(current + timedelta(n), '%Y-%m-%d')
        d = datetime.strptime(d, '%Y-%m-%d')
        date_list.append(d)
    return date_list
end_dt = datetime.strptime('2022-08-10', '%Y-%m-%d')
print(date_range(end_dt))

但运行后输出不符合预期,得到的结果是:

[datetime.datetime(2022, 7, 20, 0, 0), datetime.datetime(2022, 7, 21, 0, 0), datetime.datetime(2022, 7, 22, 0, 0), datetime.datetime(2022, 7, 23, 0, 0), datetime.datetime(2022, 7, 24, 0, 0), datetime.datetime(2022, 7, 25, 0, 0), datetime.datetime(2022, 7, 26, 0, 0), datetime.datetime(2022, 7, 27, 0, 0), datetime.datetime(2022, 7, 28, 0, 0), datetime.datetime(2022, 7, 29, 0, 0), datetime.datetime(2022, 7, 30, 0, 0), datetime.datetime(2022, 7, 31, 0, 0), datetime.datetime(2022, 8, 1, 0, 0), datetime.datetime(2022, 8, 2, 0, 0), datetime.datetime(2022, 8, 3, 0, 0), datetime.datetime(2022, 8, 4, 0, 0), datetime.datetime(2022, 8, 5, 0, 0), datetime.datetime(2022, 8, 6, 0, 0), datetime.datetime(2022, 8, 7, 0, 0), datetime.datetime(2022, 8, 8, 0, 0), datetime.datetime(2022, 8, 9, 0, 0), datetime.datetime(2022, 8, 10, 0, 0)]

预期输出

['2022-07-20', '2022-07-21',.....,'2022-08-10']

要求仅含日期无时间部分,不想使用pandas,寻求基于datetime模块的解决方案。

解决方案

核心问题是代码中多做了一次strptime转换——把已经转成字符串的日期又转回了datetime对象,导致输出是datetime实例而非字符串格式日期。只需保留字符串格式的结果即可,同时可以优化当前日期的获取逻辑。

修改后的代码如下:

from datetime import datetime, timedelta

def date_range(future_date):
    date_list = []
    # 直接获取当前日期的date对象,简化格式转换步骤
    current = datetime.today().date()
    # 兼容传入datetime或date类型的结束日期
    end_dt = future_date.date() if isinstance(future_date, datetime) else future_date
    delta_days = (end_dt - current).days
    for n in range(delta_days + 1):
        # 计算日期后直接转为yyyy-mm-dd字符串
        d = (current + timedelta(days=n)).strftime('%Y-%m-%d')
        date_list.append(d)
    return date_list

end_dt = datetime.strptime('2022-08-10', '%Y-%m-%d')
print(date_range(end_dt))

也可以用列表推导式简化写法:

from datetime import datetime, timedelta

def date_range(future_date):
    current = datetime.today().date()
    end_dt = future_date.date() if isinstance(future_date, datetime) else future_date
    return [(current + timedelta(days=n)).strftime('%Y-%m-%d') for n in range((end_dt - current).days + 1)]

end_dt = datetime.strptime('2022-08-10', '%Y-%m-%d')
print(date_range(end_dt))

运行后即可得到仅含日期字符串的列表,符合预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:06:22