Преобразование даты и времени 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(), ... );
Конечно, это предполагает, что пользователь правильно установил свой текущий часовой пояс. Это обсуждается на нескольких других сайтах:
Ответ 3
Лучший и простой способ конвертации даты и времени Google App Engine в шаблоны:
http://code.google.com/p/dateconv4gae/