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

时间:2012-10-06 21:14:33

标签: google-app-engine app-engine-ndb

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

Pacific = time.USTimeZone(-8, "Pacific",  "PST", "PDT")
addEvent.date = addEvent.date.replace(tzinfo=Pacific)

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

  

“如果datetime值具有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)

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

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

3 个答案:

答案 0 :(得分:15)

解决方案是从转换为UTC后的时间完全删除tzinfo

timestamp = timestamp.replace(tzinfo=None)

答案 1 :(得分:0)

这是我的工作示例:

if my_date.utcoffset():
    my_date = (my_date - my_date.utcoffset()).replace(tzinfo=None)

答案 2 :(得分:0)

我使用http://hnrss.org/遇到了这个问题。这是我的解决方案。

    import datetime
    from dateutil import parser

    your_date_string = 'Mon, 24 Oct 2016 16:49:47 +0000'

    your_date = parser.parse('your_date_string')
    # your_date is now a datetime.datetime object

    your_date_minus_tz = your_date.replace(tzinfo=None)

现在尝试使用put(),您应该在Cloud数据存储区中看到2016-10-24 16:49:47。