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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:42:52