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 格式的时间,因此我需要一种将欧洲/斯德哥尔摩当地时间转换为 UTC/GMT 的方法,而不使用 strptime 中的 %Z 标志... (还有比每次约会减去一小时更聪明的事情......)

再次提前谢谢你:)

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 库;它为几乎每个有用的时区提供时区对象。(我会链接到它,但垃圾邮件预防阻止了我。只需谷歌就可以了。)

于 2009-11-26T00:04:26.463 回答
0

将您的对象解析为日期时间后,您必须添加时区。为此,您需要创建派生自 datetime.tzinfo 的类

将日期时间导入为 dt
SomeZone 类(dt.tzinfo):
    # 一个帮助类来快速创建简单的时区 - 给 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): 返回 dt.timedelta(0)
    def tzname(self, dtime): 返回无

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

等等,现在它是带有时区的日期时间。从这里谷歌将接管,因为日期时间字段是区域感知的,并且存储将其存储在 UTC 中。

只要记住夏令时和一切。

如果您想四处寻找,我正在使用此处描述的课程

于 2009-11-16T22:04:56.650 回答