如何在Python中转换为UTC后完全删除tzinfo?

时间:2015-01-15 21:40:23

标签: python google-app-engine datetime pytz python-dateutil

我遇到了这个issue,我无法弄清楚如何在我的案例中找到解决方案。

Guido说

  

解决方案是从之后的时间完全删除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的任何时区?

3 个答案:

答案 0 :(得分:1)

  

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

如果aware日期时间对象已经是UTC(+0000),那么您的公式有效:

naive_utc = aware_utc.replace(tzinfo=None)

其中aware_utc是一个时区感知日期时间对象,表示UTC时间。

但是如果aware日期时间对象不是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时间戳。

答案 1 :(得分:0)

我是个白痴,现在已经很晚了,这次我读了这个问题。

tstmp= date_time.replace(tzinfo=utc).total_seconds()
naive_date = datetime.utcfromtimestamp(tstmp)

第一个答案只会给你当前的天真时间

答案 2 :(得分:0)

试试这个:

dateTime = dateTime.replace(tzinfo=None)
dtUtcAware = pytz.UTC.localize(dateTime)