Django DATETIME_FORMAT特定日期年份显示错误(差一年)排查
问题根源:ISO周年份格式化符
o的误用 嘿,这个问题我之前排查过类似的,核心坑点就在你配置里的日期格式化符o上!
你在settings.py里用的o,不是常规的公历年份Y——它代表的是ISO周编号对应的年份,规则和我们日常用的公历年份完全不一样:
- ISO周的第1周是包含当年第一个星期四的那一周
- 2019年12月30日、31日这两天,刚好属于ISO 2020年的第1周(因为这一周的星期四是2020年1月2日)
- 所以用
o格式化时,年份会被替换成2020,再搭配原有的12月30/31日,就出现了不存在的“未来日期”(实际存储是2019年,但显示成2020年12月)
快速验证方法
你可以打开Django Shell测一下,马上就能看到差异:
from datetime import datetime, timezone dt = datetime(2019, 12, 30, tzinfo=timezone.utc) print(dt.strftime('%d/%m/%o')) # 输出 30/12/2020(异常) print(dt.strftime('%d/%m/%Y')) # 输出 30/12/2019(正确)
修复方案
把settings.py里所有的o替换成Y(常规公历年份)就行:
# settings.py 修正后 TIME_ZONE = 'UTC' USE_TZ = True DATETIME_FORMAT = 'd/m/Y H:i:s' DATE_FORMAT = 'd/m/Y' TIME_FORMAT = 'H:i:s' SHORT_DATE_FORMAT = 'd/m/Y' SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
替换后,前端模板里{{ log_item.date }}就会按照数据库存储的实际公历年份显示,不会再出现这种跨年份的异常了。
补充一句:这个问题和时区配置(USE_TZ=True)无关,时区转换只会调整日期的时分秒或时区偏移后的年月日,不会直接把2019年的日期跳到2020年同月份,完全是格式化符选错导致的。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

