2009-11-13 33 views
1

我正在Google App Engine(Python)中的一個小應用程序中工作,該應用程序使用Google Data API來創建Google帳戶中的新日曆並將其填充到一些事件。GAE中使用Google Data API的本地時區問題

我正在使用的事件是從另一個地方解析出來的,他們在歐洲/斯德哥爾摩時區有日期(我認爲它是CEST或CET)。

因此,我首先創建一個Python struct_time(例如)這樣的:

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

Python的醫生說,有我可以使用標誌%Z以指定的時區,而事實上它的工作原理在我的Python解釋器中......但在Google App Engine服務器(包括本地主機和部署)中完全失敗。這是不是新的,因爲我已經看到here

由於我使用的是Google Data API,並且它需要UTC/GMT格式的時間,所以我需要一種將歐洲/斯德哥爾摩當地時間轉換爲UTC/GMT的方法,而不使用%Z標誌在strptime ...(和一些更聰明不僅僅是減去一個小時,每個日期...)

謝謝你提前更多的時間:)

+0

有關strptime的Python參考是在這裏: http://docs.python.org/library/time.html#time .strptime 由於每個帖子對於新用戶最多有1個鏈接,因此我無法在此鏈接它... – 2009-11-13 11:23:09

+0

最後,我以'簡單'的方式完成了...只使用日期時間類型並減去1小時.. 但是,學習更聰明的方法會更好:) – 2009-11-14 14:05:40

回答

0

解析你的對象爲日期時間後,你必須添加時區。爲此,您需要創建從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瞧,現在它是一個帶時區的日期時間。從這裏谷歌將接管,因爲日期時間字段區域感知和存儲將存儲在utc中。

只記得夏令時間和一切。

,如果你想清除的時候,我正在使用描述了那裏的類here

1

我張貼something related to this subject on my blog去年。基本上,它將所有時間都轉換爲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庫;它爲幾乎每個有用的時區提供時區對象。 (我會鏈接到它,但防垃圾郵件阻止我,只是谷歌它。)

相關問題