Вопрос

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

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

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

<Ол>
  • Если пользователь вводит время на входе, это будет местное время (включая летнее время, когда это необходимо).
  • Если пользователь не вводит время, система должна ввести его для него по местному времени (включая DST, когда это необходимо).
  • Когда дата и время отображаются для пользователя, они должны быть по местному времени (включая летнее время, когда это уместно)
  • Я понимаю, что время будет внутренне сохранено как UTC с объектом tzinfo, и что App Engine будет хранить модели с временем UTC.

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

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

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

    Это было полезно?

    Решение

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

    http://labix.org/python-dateutil

    Другие советы

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top