Python tzinfo и летнее время - PullRequest
       16

Python tzinfo и летнее время

4 голосов
/ 10 марта 2009

(Я новичок в Python и Google App Engine, пожалуйста, прости меня, если мои вопросы кажутся простыми).

Я чертовски стараюсь управлять несколькими часовыми поясами в моем приложении Google App Engine.

Вот мои ограничения:

  1. Если пользователь вводит время на входе, это будет местное время (включая летнее время, когда это необходимо).
  2. Если пользователь не вводит время, система должна ввести его для него по местному времени (включая DST, когда это необходимо).
  3. Когда дата и время отображаются для пользователя, они должны быть по местному времени (включая летнее время, если необходимо)

Я понимаю, что время будет внутренне сохранено как UTC с объектом tzinfo, и что App Engine будет хранить модели с временем UTC.

Ранее я думал, что у меня все получилось, попросив пользователя указать свой часовой пояс в своих предпочтениях. Затем я просто загрузил бы их настройки и добавил бы эту tzinfo к любым объектам datetime в отношении этого пользователя.

Однако наше недавнее летнее время сломало его. Оказывается, я не правильно реализовал dst () в своих объектах tzinfo. Насколько я понимаю, я должен определить, включен ли DST в настоящее время, и если да, вернуть правильное смещение для tzinfo.

Проблема в том, что я понятия не имею, как определить, является ли летнее время часового пояса текущим или нет. Я что-то упускаю из виду?

Ответы [ 2 ]

11 голосов
/ 10 марта 2009

Если вы можете, я бы порекомендовал взглянуть на пакет python-dateutil, в котором предварительно созданы объекты tz для всех часовых поясов, включая информацию о смещении DST. Я не думаю, что есть способ «просто знать», включен ли DST или нет, без поддержки данных ... это зависит от даты для большинства часовых поясов (или, по крайней мере, часовых поясов, поддерживающих DST), и даты варьируются в зависимости от местного обычаи, политика и все виды вещей.

http://labix.org/python-dateutil

2 голосов
/ 11 марта 2009

Я вижу здесь некоторые проблемы.

Если пользователь вводит время, оно вводит его в местном часовом поясе, но как узнать, какое это время? Европа / Вильнюс или Европа / Мадрид? Или, может быть, Австралия / Мельбурн? Если вы не знаете часовой пояс, дата / время становятся «наивными».

Единственной базой данных часовых поясов, которая считается подходящей и точной (учитывая состояние постоянного потока), является база данных часового пояса Олсона, доступная для Python как пакет pytz . Это позволяет легко конвертировать даты / время между часовыми поясами: сначала вы берете дату / время и часовой пояс у пользователя, локализуете дату / время в часовом поясе пользователя, а затем принимаете его как utc, готовый к сохранению в вашей базе данных. Отображение выполняется наоборот: получить дату / время из базы данных, локализовать в utc, а затем отобразить как часовой пояс пользователя.

И последнее: не существует такой вещи, как автоматическое преобразование DST . В случае неоднозначных дат / времени вы должны заранее знать, в каком часовом поясе вводится время. Это наша человеческая реальность.

...