'datetime.datetime'对象的属性'tzinfo'不可写

bob*_*obo 28 python google-app-engine datetime tzinfo

如何设置刚刚从数据存储中发出的日期时间实例的时区?

当它第一次出现时它是UTC.我想把它改成EST.

我正在尝试,例如:

class Book( db.Model ):
    creationTime = db.DateTimeProperty()
Run Code Online (Sandbox Code Playgroud)

检索Book时,我想立即设置其tzinfo:

book.creationTime.tzinfo = EST
Run Code Online (Sandbox Code Playgroud)

我用这个例子我EST对象

但是我得到:

attribute 'tzinfo' of 'datetime.datetime' objects is not writable

我已经看到了一些推荐pytz和python-dateutil的答案,但我真的想要回答这个问题.

Ale*_*lli 51

datetime对象是不可变的,所以你永远不会改变它们的任何属性 - 你创建一个具有相同属性和属性的对象,并将它分配给你需要分配给它的任何东西.

即,在你的情况下,而不是

book.creationTime.tzinfo = EST
Run Code Online (Sandbox Code Playgroud)

你必须编码

book.creationTime = book.creationTime.replace(tzinfo=EST)
Run Code Online (Sandbox Code Playgroud)

  • 注意:它不会从UTC转换为EST时区(*"它首先出现在UTC中.我想将其更改为EST."*).时间保持不变.要转换,可以使用`book.creationTime.astimezone(EST)`. (2认同)

Gle*_*ard 6

如果您收到的 EST中的日期时间,但没有设置其tzinfo字段,请使用dt.replace(tzinfo=tz)分配tzinfo而不修改时间.(您的数据库应该为您执行此操作.)

如果您正在接收UDT中的日期时间,并且您希望它在EST中,那么您需要astimezone. http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

在绝大多数情况下,您的数据库应该在UDT中存储和返回数据,您不需要使用replace(除了可能分配UDT tzinfo).