将 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,“也无法比较原始偏移量和可感知偏移量的日期时间”