【发布时间】:2021-01-29 06:59:45
【问题描述】:
我对 Django 处理时区的方式有疑问。
在我的设置中,我配置了我的时区:
USE_TZ = True
TIME_ZONE = 'Europe/Amsterdam' # At time of writing UTC+2
我有一个带有 DateTimeField 的模型。我知道,无论时区设置如何,只要 Django 将这个模型保存在时区 UTC 中。我也知道,每当 Django 遇到没有时区的日期时间(一个天真的日期时间)时,它会假定它处于默认时区(在我的例子中是阿姆斯特丹)并在保存时将其转换为 UTC。见https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/#interpretation-of-naive-datetime-objects
但是,每当我使用 Django 从数据库中检索模型时,DateTimeField 都会有一个没有时区的日期时间。我通过规范知道它是 UTC,但是每当我将模型保存回数据库时(更新某些字段后),Django 都会看到日期时间是幼稚的,并假设它在默认时区。就我而言,每次更新对象时,它都会从日期时间中减去 2 小时。
所以,每当我这样做时。
A = MyModel.object.get(pk=1)
A.some_field = 10
A.save()
我会得到一个RuntimeWarning: DateTimeField received a naive datetime,我的时间戳被减去 2 小时。
我可以解决这个问题
A = MyModel.object.get(pk=1)
A.date_time_field = A.date_time_field.replace(tzinfo=django.utils.timezone.utc)
A.some_field = 10
A.save()
但这似乎不是要走的路?
【问题讨论】:
-
这不是标准的 Django 行为,因此您的设置有些问题。您应该查看(并添加有关)您的数据库和数据库适配器的详细信息。你可能想看看你是否可以在同一个系统上用一个新的 Django 项目来复制它。
-
@KevinChristopherHenry 谢谢,我发现postgresql的字段没有启用时区。