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

Posted

技术标签:

【中文标题】python - 如何在Python中转换为UTC后完全删除tzinfo?【英文标题】:How to remove the tzinfo completely from the time after converting to UTC in Python? 【发布时间】:2015-03-14 10:32:26 【问题描述】:

我遇到了这个确切的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 = (datetime2015-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 的任何时区?

【问题讨论】:

您发布的代码(“这是我尝试过的:”)显示您将“天真的”日期时间转换为日期,但错误来自 DatetimeProperty。跟踪是否肯定会导致您显示的代码?它看起来是正确的...... @Houman:在.date() 之前不需要.replace(tzinfo=None)。它返回一个总是天真的date 对象。 【参考方案1】:

我是个白痴,来晚了,这次我读了这个问题。

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

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

【讨论】:

【参考方案2】:

试试这个:

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

【讨论】:

【参考方案3】:

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

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

naive_utc = aware_utc.replace(tzinfo=None)

其中aware_utc 是一个可感知时区的日期时间对象,它以 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 来实现这一点。非常感谢。

没有。 dateutilpytz 对您没有帮助,除非日期字符串本身包含时区(或至少包含其 UTC 偏移量)。

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

【讨论】:

请您解释一下aware_utc 是什么意思? GMT +1 是 aware_utc 吗? @Houman:是的。不。 aware_utc alwayszero UTC 偏移量。 GMT+1 意味着 1 小时 UTC 偏移量,即 GMT+1 不是 aware_utc。只需使用我提供的公式即可。它总是有效的。 非常感谢您的解释。因此,如果我的日期时间始终以 GMT 显示,则将其转换为这样更安全:naive_utc = aware.replace(tzinfo=None) - aware.utcoffset()。当心我住在英国,在冬天,我们的 UTC/GMT 偏移量为零,因此看起来是一样的。因此我在date_time = (datetime2015-01-13 18:13:26+00:00 上面提供的日期应该是 GMT +0,它不是 UTC。 (除非我把它弄混了,而且显示的格式实际上是 UTC 和 GMT 的写法不同):) @Houman:是的。如果偏移量可能不为零,那么您应该使用更通用的公式。

以上是关于python - 如何在Python中转换为UTC后完全删除tzinfo?的主要内容,如果未能解决你的问题,请参考以下文章

转换为 Unix 时间时如何指定时区 (UTC)? (Python)

Unix 纪元时间戳在 Python 中转换为 UTC 时区

如何使用python将excel文件中的时间戳列表从UTC转换为旧金山时间(太平洋时间)? [复制]

在 Python 中将 datetime.date 转换为 UTC 时间戳

如何在 Python 中获取 GMT 并将其转换为 PST

在 Python 中使用 tz.localize 将 UTC 日期时间转换为英国日期时间