2009-11-13 2 views
1

Google 데이터 엔진을 사용하는 Google App Engine (Python)의 소형 앱에서 Google 계정에 새 캘린더를 만들고 어떤 사건들.Google 데이터 API로 작업하는 GAE의 로컬 시간대 문제

내가 사용하는 이벤트는 다른 장소에서 파싱되며 유럽/스톡홀름 시간대의 날짜가 있습니다 (CEST 또는 CET라고 생각합니다).

따라서, 먼저 내가 가진 파이썬 struct_time를 작성 (예를 들어)이 :

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

파이썬의 문서는 내가 시간대를 지정하기 위해 플래그 %의 Z를 사용할 수 있으며, 실제로 작동이 말한다 파이썬 인터프리터에서는 ...하지만 Google App Engine 서버 (localhost와 deploy 모두)에서는 완전히 실패합니다. 내가 보았던 것처럼 그것은 새로운 것이 아니다. here.

Google 데이터 API를 사용하고 있으므로 UTC/GMT 형식으로 시간이 필요하므로 %/Z 플래그를 사용하지 않고 유럽/스톡홀름 현지 시간을 UTC/GMT로 변환해야합니다. strptime ... (그냥 각 날짜에 한 시간 빼기보다 더 많은 스마트 뭔가 ...)에

이 날짜에 개체를 구문 분석 후 사전을 한 번 더 :

+0

strptime에 대한 Python 참조는 다음과 같습니다. http://docs.python.org/library/time.html#time .strptime 새 사용자를위한 게시물 당 최대 1 개의 링크로 인해 여기에 연결할 수 없습니다 ... –

+0

마침내 저는 '쉬운'방법으로 ... 그냥 datetime 형식을 사용하고 1 시간을 뺍니다. . 하지만 더 똑똑한 접근법을 배우는 것이 좋을 것입니다 :) –

답변

0

에 감사합니다, 당신은에 있습니다 시간대를 추가하십시오. 그것을 위해 당신은 지금은 시간대와 날짜입니다

 
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)) 

등 짜잔 datetime.tzinfo에서 파생 된 클래스를 작성해야합니다. datetime 필드는 영역을 인식하고 저장소는 utc에 저장하므로 여기에서 Google이 대신합니다.

일광 절약제에 대해서만 기억하십시오. 당신이 주변에 폐품을 좋아하면

, 내가 거기에 설명 된 클래스를 사용하고

1

here 나는 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 라이브러리를 권장합니다. 그것은 거의 모든 유용한 시간대에 대한 시간대 객체를 제공합니다. (링크를 붙이 겠지만 스팸 방지는 나를 막아주고 있습니다.)