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?
我可以同时使用dateutil
和pytz
来实现这一点。非常感谢。
更新 这真是漫长的一天。我误读了堆栈跟踪。但是问题仍然有效。
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 来实现这一点。非常感谢。
没有。 dateutil
、pytz
对您没有帮助,除非日期字符串本身包含时区(或至少包含其 UTC 偏移量)。
记住:地球上总是中午某处,也就是说,如果你从地球上不同的地方收集日期/时间字符串,那么除非你附上,否则你无法比较它们对应的时区。您无法将其转换为 UTC,如果您不知道日期的源时区,则无法获得有效的 POSIX 时间戳。
【讨论】:
请您解释一下aware_utc
是什么意思? GMT +1 是 aware_utc
吗?
@Houman:是的。不。 aware_utc
always 有 zero 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转换为旧金山时间(太平洋时间)? [复制]