姜戈。使用设置“TIME_ZONE”和“USE_TZ = True”时,如何在UTC中将时间写入数据库

Django. How to write the time to the database in UTC when using the settings 'TIME_ZONE' and 'USE_TZ = True'

提问人:Donchack 提问时间:7/10/2023 最后编辑:Donchack 更新时间:7/10/2023 访问量:62

问:

有一个 Django 4.0 版项目。在其中,在其中一个表中,我使用一个字段来保存日期时间。我需要以UTC格式存储在PostgreSQL数据库中的日期时间。 我做了什么:

settings.py
...
USE_TZ = True
TIME_ZONE = "UTC+3"
...

models.py
class ManualMeasurements(models.Model):
    ...    
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=False,
                                     default=timezone.now)
    ....

同时,迁移到 PostgreSQL 创建了带有时区的字段:

"timestamp" timestamptz NOT NULL

好的,但是根据文档,这已经足够了,因此以管理面板的形式,此字段中的时间显示在 settings.py 中指定的时间字段中,并且数据库以 UTC 编写。但不是。我发现数据库目前是这样写的:2023-07-10 14:55:17.000 +0300

在 admin.py 中,我覆盖了保存方法:

def save_model(self, request, obj: ManualMeasurements, form, change, debug=True):
    if obj.timestamp:
        obj.timestamp = obj.timestamp.astimezone(time_func.get_timezone('UTC'))
    super().save_model(request, obj, form, change)

仍然在数据库中,我通过时区指示获取当前时区的时间。我做错了什么,我如何得到我需要的东西?

python django 日期时间

评论

0赞 AKX 7/10/2023
这里有什么问题?存储了 TZ 的时间戳总比根本没有 TZ 要好。
0赞 Donchack 7/10/2023
问题是,当从数据库获取值时,我希望确保它们在UTC中接收,并且仅在需要时区之间进行转换。因此,在从数据库请求数据时,我总是必须强制转换为 UTC,然后使用日期进行操作
0赞 AKX 7/11/2023
假设日期是 UTC 听起来比仅仅在 TZ 中使用它们并将它们输出到您需要的任何 TZ 中更容易出错......
0赞 Donchack 7/27/2023
也许你是对的。不管怎样,您将不得不使用 Django 提供的功能。

答: 暂无答案