Django и часовые пояса - использование одинакового времени в разных часовых поясах

Хорошо. Я прочитал кучу других ответов, но ни один из них, похоже, не делает того, что мне нужно. Мне нужна помощь со временем и датами.

У меня есть приложение, в котором даты и время должны основываться на местном времени пользователя, но не меняться, когда пользователь меняет часовые пояса.

Например, пользователь находится в Нью-Йорке. Приложение должно показывать местное время в Нью-Йорке. Затем пользователь может сохранить определенную дату и время, которые он хочет засечь. Все по нью-йоркскому времени. Точнее, они загружают страницу, и она показывает 10:32 утра, что является местным временем в Нью-Йорке, затем они могут регистрировать даты и время, скажем, в 13:00 по местному времени в Нью-Йорке 3 сентября (через неделю после дня регистрации).

Но затем тот же пользователь едет в Корею и загружает страницу. Теперь отображается местное время в Корее, но время в журнале теперь показывается как 3 сентября в 13:00 по корейскому времени (не эквивалентно 13:00 в Нью-Йорке).

Так, мне нужно показывать местное время, основанное на текущем часовом поясе, но при этом регистрируемые даты являются наивными по часовому поясу.

В настоящее время у меня отключена поддержка часовых поясов, но я не могу заставить его показывать местное время в приложении. Я использую timezone.now(), чтобы попытаться получить местное время.

Каким образом можно добиться того, что я описал выше, БЕЗ того, чтобы пользователь указывал свой часовой пояс вручную при каждом перемещении? Можно ли это сделать?

Всегда старайтесь хранить объекты datetime в формате UTC. У вас есть больше причин делать это, поскольку ваше приложение работает в нескольких часовых поясах. Это также рекомендуется в Django:

Даже если ваш сайт доступен только в одном часовом поясе, все равно хорошей практикой является хранение данных в UTC в вашей базе данных.

  1. Если пользователь сохраняет новую запись в базе данных, не сохраняйте запись как есть, сначала преобразуйте ее в UTC.

  2. Теперь у нас есть фиксированное ограничение, которое облегчит нам жизнь, потому что когда мы получаем значение времени в базе данных, мы знаем, что оно в UTC, независимо от того, было ли оно сохранено в Нью-Йорке August 30, 13:00 GMT-4 или в Корее August 31, 02:00 GMT+9, оба будут просто сохранены в базе данных как August 31, 17:00, UTC.

  3. Теперь, если пользователь загружает страницу, не показывайте запись как есть, сначала преобразуйте ее (которая сейчас находится в UTC) в текущий часовой пояс пользователя. Этого можно легко добиться с помощью функции datetime.astimezone().

Вернуться на верх