
当使用 `datetime.strptime()` 解析 html `` 返回的日期字符串(如 `'2024-02-15'`)时,需确保格式字符串与实际字符串结构一致;若日期含连字符(`-`),应使用 `'%y-%m-%d'` 而非 `'%y/%m/%d'`。
HTML 元素始终以 ISO 8601 格式(YYYY-MM-DD)提交值,例如 '2024-02-15'。而你的代码中使用了错误的格式串 '%Y/%m/%d'(对应 2024/02/15),导致 ValueError: time data '2024-02-15' does not match format '%Y/%m/%d'。
✅ 正确写法如下:
from datetime import datetime pFechaDesde = '2024-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 应用中处理用户日期输入的标准且推荐方式。










