1

私は Google App Engine (Python) の小さなアプリで作業しています。このアプリは Google Data API を使用して、Google アカウントで新しいカレンダーを作成し、いくつかのイベントを入力します。

私が使用しているイベントは別の場所から解析され、ヨーロッパ/ストックホルムのタイムゾーンの日付が含まれています (CEST または CET だと思います)。

したがって、最初に (たとえば) これを使用して Python struct_time を作成します。

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

Python のドキュメントには、フラグ %Z を使用してタイムゾーンを指定できると書かれており、実際には Python インタープリターで動作します... しかし、Google App Engine サーバー (ローカルホストとデプロイの両方) では完全に失敗します。私がここで見たように、それは新しいものではありません。

私は Google Data API を使用しており、UTC/GMT 形式の時間が必要なので、strptime で %Z フラグを使用せずに、ヨーロッパ/ストックホルムの現地時間から UTC/GMT に変換する方法が必要です ... (そして、各日付から 1 時間を減算するよりもスマートなこと...)

もう一度よろしくお願いします:)

4

2 に答える 2

1

昨年のブログで、このテーマに関連するものを投稿しました。基本的にデータストアに格納する際は常に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 だけです。)

于 2009-11-26T00:04:26.463 に答える
0

オブジェクトを日時に解析した後、タイムゾーンを追加する必要があります。そのためには、datetime.tzinfo から派生したクラスを作成する必要があります

日時を dt としてインポート
クラス SomeZone(dt.tzinfo):
    # 簡単なタイムゾーンをすばやく作成するためのヘルパー クラス - gmt_offset を指定
    def __init__(自己、gmt_offset):
        dt.tzinfo.__init__(自己)
        self.gmt_offset = gmt_offset        
    def utcoffset(self, dtime): dt.timedelta(hours=self.gmt_offset) を返す
    def dst(self, dtime): dt.timedelta(0) を返す
    def tzname(self, dtime): なしを返す

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

et voila、今ではタイムゾーン付きの日時です。日時フィールドはゾーンを認識し、ストレージでは utc に保存されるため、ここから Google が引き継ぎます。

夏時間とすべてについて覚えておいてください。

掃除したい場合は、ここで説明されているクラスを使用しています

于 2009-11-16T22:04:56.650 に答える