如何在Python转换为UTC后的时间完全删除tzinfo?

How to remove the tzinfo completely from the time after converting to UTC in Python?

我确实遇到了这个 issue,但我不知道如何在我的案例中实现解决方案。

圭多说

The solution is to remove the tzinfo completely from the time after converting to 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 的任何时区?

我是个白痴,来晚了,这回才看题

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

第一个答案只会给你当前的幼稚时间

试试这个:

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

Is this the correct way converting a GMT 0 datetime to UTC datetime? Or in fact any timezone to 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 是任意时区中的时区感知日期时间对象。


But I don't have the timezone. I am scraping the date from a html source. So the timezone could really be from anywhere in the world. Is there no easy and reliable way to convert a date time to UTC? I could use both dateutil and pytz to achieve this. Many Thanks.

没有。 dateutilpytz 不会帮助你,除非日期字符串本身包含时区(或至少它的 utc 偏移量)。

记住:在地球上 总是 中午 某个地方 即,如果您从地球上的不同地方收集 date/time 字符串那么除非您附加相应的时区,否则您无法比较它们。您无法将其转换为 UTC,如果您不知道日期的源时区,则无法获得有效的 POSIX 时间戳。