Django 中日期格式解析错误的解决方案

当使用 `datetime.strptime()` 解析 html `` 返回的日期字符串(如 `'2025-02-15'`)时,需确保格式字符串与实际字符串结构一致;若日期含连字符(`-`),应使用 `'%y-%m-%d'` 而非 `'%y/%m/%d'`。

HTML 元素始终以 ISO 8601 格式(YYYY-MM-DD)提交值,例如 '2025-02-15'。而你的代码中使用了错误的格式串 '%Y/%m/%d'(对应 2025/02/15),导致 ValueError: time data '2025-02-15' does not match format '%Y/%m/%d'。

✅ 正确写法如下:

from datetime import datetime

pFechaDesde = '2025-02-15'
pFecha = datetime.strptime(pFechaDesde, '%Y-%m-%d')  # 注意:用连字符,非斜杠

⚠️ 注意事项:

  • strptime() 对格式严格匹配,任何字符差异(如 / vs -、空格、多余字母)都会引发异常;
  • 若输入可能为空或格式不保证(如用户手动修改 input 值),建议增加异常处理:
try:
    pFecha = datetime.strptime(pFechaDesde, '%Y-%m-%d').date()  # .date() 得到 date 对象更常用
except ValueError as e:
    raise ValueError(f"无效的日期格式 '{pFechaDesde}',请使用 YYYY-MM-DD 格式") from e

? 更优实践:推荐使用 Django 表单系统替代手动解析。DateField 可自动完成验证、类型转换与本地化处理,大幅提升健壮性与可维护性:

# forms.py
from django import forms

class DateFilterForm(forms.Form):
    fecha_desde = forms.DateField(
        input_formats=['%Y-%m-%d'],  # 显式声明输入格式(默认已支持 ISO)
        widget=forms.DateInput(attrs={'type': 'date'})
    )

# views.py
def my_view(request

): if request.method == 'POST': form = DateFilterForm(request.POST) if form.is_valid(): pFecha = form.cleaned_data['fecha_desde'] # 直接获得 date 对象,无需 strptime! # …继续业务逻辑

使用 Form 不仅避免格式错误,还统一处理空值、边界校验(如 min_date)、国际化(DATE_INPUT_FORMATS)及前端渲染一致性,是 Django 应用中处理用户日期输入的标准且推荐方式。