MariaDB Timestamp与Django DateTimeField存在1小时时差求助
解决方案
1. 检查并修正MariaDB连接时区
登录python manage.py dbshell,执行命令查看数据库时区配置:
SELECT @@global.time_zone, @@session.time_zone;
如果返回结果包含SYSTEM,说明数据库继承了系统时区,而系统时区(CET,UTC+1)与Django配置的TIME_ZONE = 'UTC'冲突,会导致时间转换偏差。
解决方法:在Django的数据库配置中强制设置连接时区为UTC,修改settings.py的DATABASES项:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'your_db_user', 'PASSWORD': 'your_db_password', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET time_zone = '+00:00';", 'charset': 'utf8mb4', }, } }
2. 确认模型字段定义合规
确保模型中的时间字段使用标准DateTimeField,不手动处理时区逻辑:
from django.db import models class Time(models.Model): timestamp = models.DateTimeField() # 自动生成时间可添加auto_now_add=True参数
当USE_TZ = True时,Django会自动完成UTC时间与配置时区的转换,无需额外修改字段属性。
3. 排查系统时区与依赖版本
- 检查运行Django的服务器系统时区是否正确设置为CET,避免mysqlclient继承错误时区导致转换异常。
- 升级mysqlclient到最新稳定版(当前为2.2.3),修复旧版本可能存在的时区处理bug:
pip install --upgrade mysqlclient
4. 重新验证时间读取
修改配置后重启Django服务,进入python manage.py shell测试:
from testapp.models import Time record = Time.objects.first() print(record.timestamp) print(record.timestamp.tzinfo) # 正常应显示UTC或配置的TIME_ZONE值
内容的提问来源于stack exchange,提问作者Profix
相关产品推荐
相关产品推荐

