Проблема локального часового пояса в GAE при работе с Google Data API - PullRequest
1 голос
/ 13 ноября 2009

Я работаю в небольшом приложении в Google App Engine (Python), которое использует API данных Google для создания нового календаря в учетной записи Google и заполнения его некоторыми событиями.

События, которые я использую, анализируются из другого места, и у них есть дата в часовом поясе Европы / Стокгольма (я думаю, что это CEST или CET).

Поэтому сначала я создаю Python struct_time с (например) этим:

start = strptime("2009-11-16 10:15", "%Y-%m-%d %H:%M")

Документ Python говорит, что там я мог бы использовать флаг% Z для указания часового пояса, и фактически он работает в моем интерпретаторе Python ... но он полностью не работает на сервере Google App Engine (как localhost, так и deploy) , Это что-то не новое, как я видел здесь .

Поскольку я использую API данных Google, и ему нужно время в формате UTC / GMT, мне нужен способ конвертации из европейского / стокгольмского местного времени в UTC / GMT, без использования% Z флаг в strptime ... (и что-то более умное, чем просто вычитать один час на каждую дату ...)

Заранее спасибо еще раз:)

Ответы [ 2 ]

1 голос
/ 26 ноября 2009

Я опубликовал что-то, связанное с этой темой, в моем блоге в прошлом году. По сути, он преобразует все время в UTC при сохранении их в хранилище данных и прикрепляет к ним часовой пояс UTC при считывании. Вы можете изменить его, чтобы затем преобразовать значения в любой местный часовой пояс.

Этот пример кода может быть устаревшим - я давно не пользовался appengine. Но я надеюсь, что это поможет вам.

import pytz

class TzDateTimeProperty(db.DateTimeProperty):
    def get_value_for_datastore(self, model_instance):
        if model_instance.posted_at.tzinfo is None:
            model_instance.posted_at = model_instance.posted_at.replace(tzinfo=pytz.utc)
        else:
            model_instance.posted_at = model_instance.posted_at.astimezone(pytz.utc)
        return super(TzDateTimeProperty, self).get_value_for_datastore(model_instance)
    def make_value_from_datastore(self, value):
        value = super(TzDateTimeProperty, self).make_value_from_datastore(value)
        if value.tzinfo is None:
            value = value.replace(tzinfo=pytz.utc)
        else:
            value = value.astimezone(pytz.utc)
        return value

Я также рекомендую отличную библиотеку pytz; он предоставляет объекты часового пояса практически для каждого полезного часового пояса. (Я бы дал ссылку на него, но предотвращение спама останавливает меня. Просто Google для этого.)

0 голосов
/ 17 ноября 2009

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

import datetime as dt
class SomeZone(dt.tzinfo):
    # a helper class to quickly create simple timezones - give gmt_offset
    def __init__(self, gmt_offset):
        dt.tzinfo.__init__(self)
        self.gmt_offset = gmt_offset        
    def utcoffset(self, dtime): return dt.timedelta(hours=self.gmt_offset)
    def dst(self, dtime): return dt.timedelta(0)
    def tzname(self, dtime): return None

start = strptime("2009-11-16 10:15", "%Y-%m-%d %H:%M")
start.replace(tzinfo=SomeZone(your_offset_here))

et вуаля, теперь это дата и время с часовым поясом. отсюда Google вступит во владение, так как поля даты и времени являются зонными, и в хранилище будут хранить его в utc.

просто помните о летнем времени и обо всем.

если вы хотите копаться, я использую класс, описанный там здесь

...