
在 django 中从数据库读取 datefield 值后若以字符串形式(如存入 session)暂存,再次转换为 `date` 或 `datetime` 对象时,需使用 python 标准库的 `strptime`,其格式符为 `%y-%m-%d`,而非 django 模板语法或错误拼写的 `%yyyy-%mm-%d`。
Django 的 DateField 在数据库中存储为标准日期类型(如 DATE),但当它被序列化为字符串(例如通过 str()、JSON 序列化、或存入 session)时,会默认转为 ISO 格式字符串,形如 '2024-02-14'。此时若需还原为 Python 的 date 对象(注意:不是 datetime),应优先使用 date.fromisoformat() —— 这是更简洁、安全且专为此设计的方法:
from datetime import date got_date = myModel.objects.get(id=1).date # 直接是 date 对象(无需转换!) # 若已变成字符串(如从 session 取出): got_date_str = "2024-02-14" got_date_obj = date.fromisoformat(got_date_str) # ✅ 推荐:简洁、高效、无需格式字符串
如果确实需要使用 strptime(例如处理非 ISO 格式),则必须遵循 Python 的 strftime/strptime 格式码:
- %Y 表示 4 位数字年份(✅ 正确);%YYYY 是无效格式,会直接报错;
- %m 表示零填充月份数(01–12);%MM 无效;
- %d 表示零填充日期(01–31);%d 正确,%DD 无效。
因此,修正后的代码应为:
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
from datetime import datetime got_date_str = "2024-02-14" got_date_2 = datetime.strptime(got_date_str, "%Y-%m-%d").date() # → date 对象 # 或保留为 datetime: # got_datetime = datetime.strptime(got_date_str, "%Y-%m-%d") # → datetime 对象
⚠️ 注意事项:
- models.DateField(default=datetime.datetime.today) 存在隐患:datetime.today() 返回 datetime 对象,而 DateField 期望 date;虽 Django 会自动截断时间部分,但更推荐使用 date.today(无括号)作为可调用对象,或 django.utils.timezone.now().date(支持时区);
- 若字段值本身已是 date 类型(如 myModel.objects.get(...).date),无需任何解析——直接使用即可;
- 从 session 读取的日期字符串,建议统一用 date.fromisoformat() 处理,它比 strptime 更快、更鲁棒,且不依赖格式声明;
- 避免混用 datetime 和 date:向 DateField 赋值时传入 datetime 会被静默截断,但可能引发时区或逻辑歧义。
总结:处理 Django DateField 字符串反序列化,首选 date.fromisoformat();必须用 strptime 时,请严格使用 %Y-%m-%d 格式符,并确认输入字符串符合该模式。









