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
相关产品推荐
相关产品推荐

