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

Django中DateTimeField输出时间少1小时的问题解决求助

解决Django DateTimeField显示时差1小时的问题

这个问题我之前帮不少开发者踩过坑,本质是Django的时区转换逻辑在起作用:你在Admin里设置的是本地时区(比如中欧时区UTC+1)的时间,但Django默认会把DateTimeField转换成UTC时区存储到数据库。当你直接调用starts_at.date()或starts_at.time()时,拿到的是UTC时区的时间,所以才会比你设置的少1小时。

下面是具体的解决步骤:

1. 确认项目时区配置正确

先检查你的settings.py文件,确保这两个配置是正确的:

# 设置为你所在的时区,比如中欧时区
TIME_ZONE = 'Europe/Berlin'
# 必须开启,Django才会处理时区转换
USE_TZ = True

USE_TZ = True是Django的默认配置,它会自动把用户输入的本地时间转成UTC存储,读取时再转回来——前提是你要正确调用转换方法。

2. 读取时间时转换为本地时区

不要直接用原始的starts_at对象格式化时间,先把它转换成本地时区的时间:

方法一:用localtime()函数(推荐)

Django提供了django.utils.timezone.localtime()函数,会自动根据TIME_ZONE配置把UTC时间转成本地时间:

from django.utils.timezone import localtime
import json
from django.core.serializers.json import DjangoJSONEncoder

# 转换为本地时区的datetime对象
local_time = localtime(starts_at)
# 格式化日期和时间
beginn_date = json.dumps(local_time.strftime("%d-%m-%Y"), cls=DjangoJSONEncoder)
beginn_zeit = json.dumps(local_time.strftime("%H:%M"), cls=DjangoJSONEncoder)

方法二:手动指定时区转换

如果你需要更灵活的时区控制,可以用astimezone()方法指定具体时区:

from django.utils.timezone import get_current_timezone
import json
from django.core.serializers.json import DjangoJSONEncoder

# 获取当前项目配置的时区
local_tz = get_current_timezone()
# 转换时区
local_time = starts_at.astimezone(local_tz)
# 格式化输出
beginn_date = json.dumps(local_time.date().strftime("%d-%m-%Y"), cls=DjangoJSONEncoder)
beginn_zeit = json.dumps(local_time.time().strftime("%H:%M"), cls=DjangoJSONEncoder)

3. 验证逻辑

当你在Admin设置17.03.2018 14:00(本地时区),Django会把它转换成UTC时间17.03.2018 13:00存入数据库。通过上面的方法转换后,又会把UTC时间转回本地时区的14:00,这样格式化出来的结果就和你设置的一致了。

注意:不要关闭USE_TZ来解决这个问题,UTC存储是跨时区应用的最佳实践,能避免很多时间相关的bug。

内容的提问来源于stack exchange,提问作者khashashin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:50