Django 时间戳转本地时区正确datetime后存入数据库时间偏差问题求解
问题根源
你遇到的时间偏差是Django时区处理逻辑和你的配置、输入参数不匹配导致的:
- 你通过
datetime.fromtimestamp生成的是带柏林时区信息的感知型datetime对象(aware datetime) - 你的项目配置
USE_TZ = False,此时Django默认会把带时区的datetime自动转换为UTC时间存入数据库,柏林时区比UTC早1小时,所以存入的时间会少1小时。
解决方案
根据你的业务需求选择以下任意一种即可:
方案1:调整项目配置(推荐,符合Django时区处理最佳实践)
修改settings.py配置:
USE_TZ = True
- 该方案下Django会统一将所有时间以UTC格式存入数据库,在读取、打印展示时自动按照你配置的
TIME_ZONE = 'Europe/Berlin'转换为当地时间,完全兼容你现有生成时间戳的代码,还能避免夏令时切换、跨时区业务带来的时间错误问题。 - 此时你在数据库中看到的UTC时间是正常存储格式,业务层使用时会自动转换为正确的柏林时间,不需要额外处理。
方案2:修改存入代码(适合要求数据库直接存储柏林当地时间的场景)
如果你的业务要求数据库中必须直接存储柏林时区的当地时间,不需要支持跨时区处理,不需要修改配置,只需要在存入数据库前去掉datetime的时区信息即可:
BedTemperatureHistory.objects.create(TimeStamp=timestamp.replace(tzinfo=None))
- 当
USE_TZ = False时,Django会直接将不带时区信息的原生datetime(naive datetime)原样存入数据库,不会做任何时区转换,就能得到你要的2021-11-10 15:22:26结果。
内容的提问来源于stack exchange,提问作者Felix Dango
相关产品推荐
相关产品推荐

