将 datetime.min 转换为偏移感知日期时间

Posted

技术标签:

【中文标题】将 datetime.min 转换为偏移感知日期时间【英文标题】:Convert datetime.min into offset aware datetime 【发布时间】:2019-10-10 17:58:46 【问题描述】:

我需要用 datetime.min 减去一个时区感知 datetime.now(),但我不断收到此错误 TypeError: can't minus offset-naive and offset-aware datetimes。请帮忙!

from datetime import datetime
from pytz import timezone
now = datetime.now(timezone('Europe/Dublin'))
result = now - datetime.min

【问题讨论】:

我猜你已经检查了那个答案吧? (***.com/questions/796008/…) 是的,我已经检查了这篇文章第一个答案是删除时区意识,第二个解决方案是让 datetime.now() 知道,但我的要求是让 datetime.min 知道 让 datetime.min 意识到将是......有趣。反过来做 【参考方案1】:

您可以将其转换为UTC:

In [1]: from datetime import datetime

In [2]: import pytz

In [3]: dt_min = datetime.min

In [4]: print(dt_min)
0001-01-01 00:00:00

In [5]: dt_min = dt_min.replace(tzinfo=pytz.UTC)

In [6]: print(dt_min)
0001-01-01 00:00:00+00:00

所以你的代码是:

from datetime import datetime
import pytz
now = datetime.now(pytz.timezone('Europe/Dublin'))
dt_min = datetime.min
result = now - dt_min.replace(tzinfo=pytz.UTC)
print(result)

output:
737202 days, 7:27:48.839353

【讨论】:

比我的答案更好【参考方案2】:

datetime.min 没有附加时区信息,因此是“offset-naive”。 now 附有时区信息(“都柏林”),因此是“偏移感知”。

datetime 对象进行时间操作需要它们保持一致。想想如何从“22:00:00 SAST”中减去没有 TZ 的“13:22:45”? “13:22:45”也是 GMT+2 吗?你不知道。

因此,将其中一个转换为您需要的时区。将datetime.min 转换为您的时区会出现OverflowError,所以换个方式。

tz = timezone('Europe/Dublin')
now_utc = pytz.UTC.normalize(now)
now_naive = now_utc.replace(tzinfo=None)
result_timedelta = now_naive - datetime.min

【讨论】:

以上是关于将 datetime.min 转换为偏移感知日期时间的主要内容,如果未能解决你的问题,请参考以下文章

将日期、时间和 UTC 偏移值转换为自 unix 纪元以来的毫秒数?

无法比较偏移天真和偏移感知日期时间 - last_seen 选项 [重复]

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

Mongo ObjectID:即使使用 pytz,“也无法比较原始偏移量和可感知偏移量的日期时间”

python - 如何在没有dateutil的情况下将时区感知字符串转换为Python中的日期时间?

试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间