【问题标题】:Convert datetime.min into offset aware datetime将 datetime.min 转换为偏移感知日期时间
【发布时间】: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

【问题讨论】:

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

标签: python timezone


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 2010-10-22
    • 2023-04-02
    • 2021-07-07
    • 2015-06-15
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多