Как я должен работать с датами в Django и PosgeSQL?
У меня есть приложение Django, которое должно поддерживать различные часовые пояса. Я сохраняю события в базе данных, которые имеют временные метки, и на основе этих временных меток я хочу отправлять уведомления. Поскольку пользователь может перемещаться в другой часовой пояс, я хочу хранить временные метки как время UTC и конвертировать их в текущий часовой пояс пользователя позже. Если я правильно понимаю, PostgreSQL автоматически конвертирует временные метки в UTC? В данный момент я получаю ошибку RuntimeWarning: DateTimeField event.timestamp received a naive datetime (2022-02-15 15:00:00) while time zone support is active.. Раньше я использовал make_aware от Django при сохранении временной метки и тогда не получал этого предупреждения. Вопросы, на которые я хотел бы получить ответ, следующие:
- Должен ли я сохранять в базе данных данные о времени, если я хочу поддерживать несколько часовых поясов?
- Что следует использовать в переменных
TIME_ZONEиUSE_TZвsettings.py?UTCиTrue? - Я храню информацию о часовом поясе в базе данных, какой правильный метод активировать ее, когда я хочу получить местное время для пользователя?
django.utils.timezone.activate+get_current_timezoneили есть какая-то функция типа astimezone(string_from_db)?
Должен ли я сохранять в базе данных данные о времени, если я хочу поддерживать несколько часовых поясов?
Понять часовые пояса мне помог тот факт, что время, представленное в виде временной метки unix timestamp, является константой и не зависит от того, где находится пользователь на земном шаре. Временная метка сохраняется в Postgres как таковая. Часовой пояс - это просто необязательная дополнительная информация, не более того. Можно взять число временной метки unix и преобразовать его в часовой пояс A, B или любой другой, какой захочется. Это полностью зависит от запроса.
Хранение информации о часовом поясе в базе данных говорит только о том, что вы должны указать часовой пояс при сохранении атрибута модели, иначе вы получите предупреждение. Предупреждение означает, что база данных не знает, как к этому относиться, и будет считать, что это часовой пояс по умолчанию, что обычно неверно.
Я считаю очень удобным хранить информацию о часовых поясах в базе данных, но не потому, что это "поддерживает несколько часовых поясов", а потому, что это менее запутанно и чище. Ваши пользователи уже находятся в нескольких часовых поясах, и все они ожидают увидеть время в своем собственном часовом поясе. Если вы используете часовые пояса, то вам не нужно конвертировать в UTC и обратно и размышлять, конвертировано ли уже это число или нет.
Я столкнулся с такими проблемами, как: когда пользователь создает элемент, через секунду он видит, что элемент был создан 2 часа назад, потому что вы не включили часовой пояс в время создания.
Что следует использовать в переменных?
USE_TZ = True
TIME_ZONE = "UTC"
В Django 5.0 USE_TZ станет True по умолчанию.
каков правильный метод получения местного времени для пользователя
Если вы возвращаете значения времени с временной зоной, JavaScript легко преобразует их в часовой пояс пользователя по умолчанию. Если вы используете шаблоны Django и все время должно отображаться в другом часовом поясе, чем тот, в котором находится пользователь, то это немного сложнее: нужно сохранить предпочитаемый пользователем часовой пояс в его профиле и активировать его с помощью timezone.activate, как вы правильно указали.