我碰到了这个确切的issue,我无法弄清楚该如何实现该解决方案。

圭多说


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


这是我尝试过的:

        date_time = parser.parse(i.pubDate.text)
        news.publication_date = date_time.replace(tzinfo=None).date()


而且我得到了同样的错误:

NotImplementedError: DatetimeProperty publication_date_time can only support UTC. Please derive a new Property to support alternative timezones.


所以看来我必须先将日期转换为UTC。在这里,我的研究使我失败了。

我遇到了这个solution

建议的解决方案是这样的:

def date_time_to_utc(date_time):
        tz = pytz.timezone('???')
        return tz.normalize(tz.localize(date_time)).astimezone(pytz.utc)


但是我没有时区。我从html来源抓取日期。因此,时区实际上可能来自世界任何地方。没有简单可靠的方法将日期时间转换为UTC吗?
我可以同时使用dateutilpytz来实现这一点。非常感谢。

更新
这真是漫长的一天。我误读了堆栈跟踪。但是,该问题仍然有效。

date_time = (datetime}2015-01-13 18:13:26+00:00
news.publication_date_time = date_time


这导致了崩溃。通过执行此操作,我似乎通过了单元测试:

news.publication_date_time = date_time.replace(tzinfo=None)


这是将GMT 0日期时间转换为UTC日期时间的正确方法吗?或者实际上是UTC的任何时区?

最佳答案

这是将GMT 0日期时间转换为UTC日期时间的正确方法吗?或者实际上是UTC的任何时区?


如果aware日期时间对象已经存在于UTC(+0000)中,那么您的公式将起作用:

naive_utc = aware_utc.replace(tzinfo=None)


其中,aware_utc是可识别时区的datetime对象,以UTC表示时间。

但是,如果aware datetime对象不在UTC中;它失败。在一般情况下,您应考虑(可能)非零UTC偏移量:

assert aware.tzinfo is not None and aware.utcoffset() is not None
# local time = utc time + utc offset (by definition)
# -> utc = local - offset
naive_utc = aware.replace(tzinfo=None) - aware.utcoffset()


其中,aware是任意时区中可识别时区的日期时间对象。




  但是我没有时区。我从HTML抓取日期
  资源。因此,时区实际上可能来自世界任何地方。是
  有没有简单可靠的方法可以将日期时间转换为UTC?我可以
  同时使用dateutil和pytz来实现此目的。非常感谢。


否。除非日期字符串本身包含时区(或至少包含其utc偏移量),否则dateutilpytz将无济于事。

请记住:地球上的某个地方通常是中午,也就是说,如果您从地球上的不同地方收集日期/时间字符串,那么除非您附加了相应的时区,否则您将无法进行比较。如果您不知道该日期的源时区,则无法将其转换为UTC,也无法获得有效的POSIX时间戳。

关于python - 如何从Python转换为UTC之后完全删除tzinfo?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27973478/

10-16 06:08