2010-01-18 110 views
1

我想设置每个datetime实例自动的.tzinfo一旦它出来的数据存储。谷歌应用程序引擎从数据存储刷新后

所以,如果我有

class Message(db.Model): 
    creationTime = db.DateTimeProperty() 
    someOtherTime = db.DateTimeProperty() 

    ## I really want to define a method like this, 
    ## that runs immediately AFTER an instance has 
    ## been refreshed from the datastore 
    def wakeup(self): 
     self.creationTime.tzinfo = self.creationTime.replace(tzinfo=EST) 
     self.someOtherTime.tzinfo = self.creationTime.replace(tzinfo=EST) 

是否有可能做到这一点在GAE?

回答

2

我认为最好的办法是给你的:

  • 要显示日期的用户,将它们转换like thispacific_time = utc_time.astimezone(Pacific_tzinfo())
  • 在更新数据存储,使用替换功能设置tzinfo属性DateTimeProperty类并覆盖其方法make_value_from_datastore

    class EstDateTimeProperty(db.DateTimeProperty): 
        def make_value_from_datastore(self, value): 
        naive_utc = db.DateTimeProperty(self, value) 
        aware_utc = naive_utc.replace(tzinfo=UTC) 
        return aware_utc.astimezone(EST) 
    

    给定合适的tzinfo对象UTC一个当然是EST(由pytz或其他构建)。当然,如果您需要几个不同的日期时间属性来使用不同的时区,您也可以构建一个更通用的“智能日期时间”属性类,并让它设置来自__init__中关键字参数的感兴趣时区。

  • +0

    完全正确的方法来做到这一点。 :) – 2010-01-19 11:28:24

    1

    恕我直言,这不是处理GAE时区的最佳方法。来自docs

    如果日期时间值具有tzinfo属性,则它将被转换为UTC时区进行存储。值从数据存储返回UTC,tzinfo为None。需要日期和时间值在特定时区的应用程序必须在更新值时正确设置tzinfo,并在访问该值时将值转换为时区。

    所以,

    1. 要处理的创建日期或最后修改日期,use auto_now and auto_now_add argumentsdate_from_user.replace(tzinfo=EST)
    相关问题