【问题标题】:How should I handle datetimes with Django and PosgeSQL?我应该如何使用 Django 和 PostgreSQL 处理日期时间?
【发布时间】:2022-02-16 06:45:24
【问题描述】:
我有一个需要支持不同时区的 Django 应用程序。我正在将事件保存到我的数据库中,这些事件具有时间戳,并且基于我想要发送通知的那些时间戳。因为用户可以移动到不同的时区,我想将时间戳存储为 UTC 时间并稍后将它们转换为用户当前时区。如果我是正确的,PostgreSQL 会自动将日期时间转换为 UTC 吗?目前我收到一个错误RuntimeWarning: DateTimeField event.timestamp received a naive datetime (2022-02-15 15:00:00) while time zone support is active.。我曾经在保存时间戳时使用Django的make_aware,然后没有收到此警告。我想得到答案的问题是:
- 如果我想支持多个时区,是否应该将感知日期时间保存到数据库中?
- 我应该在
settings.py 中的变量TIME_ZONE 和USE_TZ 中使用什么? UTC 和 True?
- 我将时区信息存储到数据库中,当我想为用户获取本地时间时,激活它的正确方法是什么?
django.utils.timezone.activate + get_current_timezone 或者有没有像 astimezone(string_from_db) 这样的函数?
【问题讨论】:
标签:
python
django
datetime
timezone
【解决方案1】:
如果我想支持多个时区,是否应该将感知日期时间保存到数据库中?
帮助我理解时区的事实是,当显示为 unix timestamp 时,时间是一个常数,并不取决于用户在全球的哪个位置。时间戳就这样保存到 Postgres 中。时区只是一个可选的额外信息,仅此而已。可以获取 unix 时间戳编号并将其转换为时区 A、B 或任何他想要的。这完全取决于请求。
将时区信息存储到数据库仅表示您必须在持久化模型属性时提供时区,否则您将收到该警告。警告意味着数据库不知道如何处理它,会认为它处于默认时区,这通常是错误的。
我发现将时区信息存储到数据库中非常方便,但这并不是因为它“支持多个时区”,而是因为它不那么混乱和简洁。您的用户已经在多个时区,他们都希望在自己的时区看到时间。如果您使用时区,那么您不需要与 UTC 相互转换并考虑这个数字是否已经转换。
我遇到了以下问题:当用户创建一个项目时,在一秒钟后他看到一个项目是在 2 小时前创建的,因为您没有在创建时间中包含时区。
我应该在变量中使用什么?
USE_TZ = True
TIME_ZONE = "UTC"
在 Django 5.0 中,USE_TZ 默认会变为 True。
获取用户当地时间的正确方法是什么
如果您返回带有时区的时间值,JavaScript 默认很容易将它们转换为用户的时区。如果您正在使用 Django 模板并且所有时间都应该出现在与用户所在的不同时区中,那么它会涉及更多:需要将用户的首选时区保存在他的个人资料中并使用 timezone.activate 激活它,正如您正确指出的那样。