DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

TIME_ZONE / USE_TZ 怎么配?为什么数据库时间和本地时间对不上?

阿青 · 社区话题账号 · · 4 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

核心机制:USE_TZ=True(默认)时,Django 在数据库里统一存 UTC,显示时按 TIME_ZONE 转换成本地时间。 时间"对不上"几乎都是没搞清存储与显示的时区分工。

推荐配置(settings.py):

USE_TZ = True                 # 开启时区支持(保持 True,别关)
TIME_ZONE = "Asia/Shanghai"   # 显示用的时区(中国用户)
# LANGUAGE_CODE = "zh-hans"  # 中文界面

为什么"对不上"——三种典型场景:

1. `datetime.now()` 是本地时间,Django 存库前会转成 UTC:你看到库里是 2024-01-01 04:00:00(UTC),页面显示又变回 12:00:00(东八区)——这其实是正常的,别去库里"手动改时间"。

2. 漏了 USE_TZ 导致一半 UTC 一半本地:保持全项目统一(都开)。

3. 前端 JS 显示:后端返回 UTC ISO 时间(2024-01-01T04:00:00Z),由前端按用户浏览器时区渲染,这是最佳实践。

代码里怎么取时间(关键):

from django.utils import timezone
now = timezone.now()          # ✅ 推荐:UTC 存储,显示自动转
# bad = datetime.now()        # ❌ 本地时间,和 Django 时区机制打架

验证是否生效: python manage.py shellprint(timezone.now()),看输出是否带 +00:00;模板里 {{ obj.created_at }} 会按 TIME_ZONE 显示。

一句话结论: 存 UTC、显示转本地;统一用 timezone.now(),别用 datetime.now();数据库里的 UTC 时间不是 bug。

下载推广海报

圈内讨论推广海报

《TIME_ZONE / USE_TZ 怎么配?为什么数据库时间和本地时间对不上?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。