使用googledataapi的GAE中的本地时区问题

2024-06-16 18:47:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在googleappengine(Python)的一个小应用程序中工作,它使用googledataapi在Google帐户中创建一个新的日历,并用一些事件填充它。在

我使用的事件是从另一个地方解析出来的,它们的日期是欧洲/斯德哥尔摩时区(我想是CEST或CET)。在

因此,首先,我创建一个Python struct_time(例如)如下:

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

Python的doc说我可以使用标志%Z来指定时区,事实上它在Python解释器中工作。。。但它在googleappengine服务器(localhost和deploy)中完全失败。这不是什么新鲜事,正如我所看到的here。在

因为我使用的是Google数据API,它需要UTC/GMT格式的时间,所以我需要一种方法来将欧洲/斯德哥尔摩当地时间转换为UTC/GMT,而不需要在strptime中使用%Z标志。。。(还有比每次约会少一个小时更聪明的方法…)

再次感谢您:)


Tags: 方法应用程序标志地方google时间事件帐户
2条回答

在将对象解析为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))

等等,现在是带时区的日期时间。从这里开始,google将接管,因为datetime字段是分区感知的,并且在存储上将以utc格式存储。在

记住夏令时之类的。在

如果您想四处搜寻,我使用上面描述的类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库;它为几乎每个有用的时区提供时区对象。(我想链接到它,但是垃圾邮件预防阻止了我。只需谷歌搜索。)

相关问题 更多 >