Преобразование даты и времени UTC в локальную дату и время пользователя

Я использую python для Django и Google App Engine. Я также использую DateTimeProperty в одной из моих моделей. Иногда я хотел бы отображать эту дату и время для пользователя.

Что лучше всего преобразовать datetime, хранящиеся в DateTimeProperty, в пользовательское время datetime?

Или более точный способ постановки вопроса. Каков наилучший способ получить часовую зону клиента и преобразовать объект datetime python в свое местное время?

Ответ 1

Это скорее вопрос Python, чем GAE, если у GAE нет некоторой инфраструктуры для облегчения этого (я сделал быстрое сканирование, но не нашел ссылки).

В принципе, вы хотите сохранить дату/время в часовом поясе UTC (например, использовать datetime.datetime.utcnow) вместе с часами пользователя, которые вы можете либо попытаться извлечь из пользовательских IP-адресов (используя GeoDjango, если они доступны в GAE, или pygeoip, вам нужна некоторая геолокация db, например: http://www.maxmind.com/app/geolitecity), или явно спросить пользователей об этом, что имеет то преимущество, что вы можете попросить описательное название часового пояса, например, "Европа/Варшава". Если вы попросите только UTC + 2, вы потеряете любое указание на сдвиги DST.

Затем вы можете перейти от utc к нужному часовому поясу, используя, например, pytz:

import pytz
local_tz = pytz.timezone(timezone_name)
return timestamp_utc.replace(tzinfo=pytz.utc).astimezone(local_tz).replace(tzinfo=None)

- где timestamp_utc - это utc datetime, которое вы хотите преобразовать, а timezone_name - упомянутая "Европа/Варшава".

(Заметим, что я не знаю, какая из этих работ работает в GAE, но по крайней мере вы будете знать, что искать)

Ответ 2

Итак, я сделал немного больше исследований. Чтобы правильно делать часовые пояса, вы должны следовать примеру Томаша в своем ответе. Однако, если вы готовы терпеть битку, вы можете получить 90% пути с гораздо меньшими усилиями.

Когда пользователь регистрируется или выполняет какие-либо действия на вашем сайте, вы можете использовать javascript для получения их текущего смещения часового пояса, а затем отправить его в следующий запрос:

var offset = (new Date()).getTimezoneOffset()
$.post("post.html", "offset="offset.toString(), ... );

Конечно, это предполагает, что пользователь правильно установил свой текущий часовой пояс. Это обсуждается на нескольких других сайтах: