7

这是我正在尝试做的事情:用户提交太平洋时间,一旦提交,我使用 .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。需要日期和时间值的应用程序在特定time zone 必须在更新 value 时正确设置 tzinfo,并在访问 value 时将 value 转换为 timezone。"

但是,当我执行 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”,我仍然会遇到同样的错误。

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

4

3 回答 3

15

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

timestamp = timestamp.replace(tzinfo=None)
于 2012-10-07T00:25:33.367 回答
0

这是我的工作示例:

if my_date.utcoffset():
    my_date = (my_date - my_date.utcoffset()).replace(tzinfo=None)
于 2015-07-10T11:14:57.343 回答
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。

于 2016-12-21T15:42:29.040 回答