调用put()时为什么不将自动转换日期时间自动转换为UTC

ice*_*ire 6 google-app-engine app-engine-ndb

这是我正在尝试做的事情:用户在太平洋提交时间,一旦提交,我使用.replace将时区设置为太平洋.

Pacific = time.USTimeZone(-8, "Pacific",  "PST", "PDT")
addEvent.date = addEvent.date.replace(tzinfo=Pacific)
Run Code Online (Sandbox Code Playgroud)

一旦我设置了tzinfo,我就做了一个put.根据google appengine的python文档,它说:

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

但是,当我执行put()时,我收到以下错误:

警告2012-10-06 21:10:14,579 tasklets.py:399]初始生成器_put_tasklet(context.py:264)引发NotImplementedError(DatetimeProperty日期只能支持UTC.请派生一个新属性以支持备用时区.)警告2012 -10-06 21:10:14,579 tasklets.py:399]暂停生成器put(context.py:703)引发NotImplementedError(DatetimeProperty日期只能支持UTC.请派生一个新属性来支持备用时区.)

请注意我使用的是NDB

好的,所以在做完之后我假设NDB可能不会自动将其转换为UTC.那么我尝试使用以下代码将其转换为UTC:

class UTC(tzinfo):
  def utcoffset(self, dt):
    return timedelta(0)
  def tzname(self, dt):
    return str("UTC")
  def dst(self, dt):
    return timedelta(0)
Run Code Online (Sandbox Code Playgroud)

现在,即使将太平洋时间转换为UTC并将tzinfo名称设置为"UTC",我仍然会得到相同的错误.

真的可以在这里使用大量的帮助......谢谢!

Gui*_*sum 15

解决方案是tzinfo在转换为UTC后完全删除.

timestamp = timestamp.replace(tzinfo=None)
Run Code Online (Sandbox Code Playgroud)

  • 实际上一个例子本来是非常有用的. (3认同)