带有时区信息的日期时间模块中的python timedelta计算[重复]

Posted

技术标签:

【中文标题】带有时区信息的日期时间模块中的python timedelta计算[重复]【英文标题】:python timedelta calcualtion in datetime module with time zone info [duplicate] 【发布时间】:2021-11-25 17:21:37 【问题描述】:

例如,我正在尝试计算“现在”和新年前夜之间的时差。 当我将时区信息设置为“欧洲/罗马”时,计算中会出现 10 分钟的错误。 如果没有时区信息,则错误为 1 小时。

我做错了什么???

这是一个示例代码:

from datetime import datetime
import pytz

now   = datetime.now()
nowtz = datetime.now(tz=pytz.timezone("Europe/Rome"))

fut   = datetime(2022,12,31,23,59,59)
futtz = datetime(2022,12,31,23,59,59,tzinfo=pytz.timezone("Europe/Rome"))

delta = fut - now
deltatz = futtz - nowtz

print("Without timezone:")
print("Now: " + now.strftime("%Y/%m/%d %H:%M:%S"))
print("Tar: " + fut.strftime("%Y/%m/%d %H:%M:%S"))
print("Dif: " + str(delta))
print("")
print("With timezone:")
print("Now: " + nowtz.strftime("%Y/%m/%d %H:%M:%S"))
print("Tar: " + futtz.strftime("%Y/%m/%d %H:%M:%S"))
print("Dif: " + str(deltatz))

还有一个输出:

Without timezone:
Now: 2021/10/05 14:12:09
Tar: 2022/12/31 23:59:59
Dif: 452 days, 9:47:49.933575

With timezone:
Now: 2021/10/05 14:12:09
Tar: 2022/12/31 23:59:59
Dif: 452 days, 10:57:49.908281

python中计算时间差的正确方法是什么?

我使用的参考值:https://www.timeanddate.com/counters/newyear.html?p0=215

【问题讨论】:

注意:使用 Python 3.9,您可以避免 zoneinfo、see e.g. here 的“本地化”陷阱 【参考方案1】:

对于遇到此问题的其他人,这里有一个解决方案:

from datetime import datetime
import pytz

tzone = pytz.timezone("Europe/Rome")

now   = datetime.now().astimezone()
nowtz = datetime.now(tz=tzone)

fut   = datetime(2021,12,31,23,59,59).astimezone()
futtz = tzone.localize(datetime(2021,12,31,23,59,59), is_dst=None)

delta = fut - now
deltatz = futtz - nowtz

print("Without timezone:")
print("Now: " + now.strftime("%Y/%m/%d %H:%M:%S"))
print("Tar: " + fut.strftime("%Y/%m/%d %H:%M:%S"))
print("Dif: " + str(delta))
print("")
print("With timezone:")
print("Now: " + nowtz.strftime("%Y/%m/%d %H:%M:%S"))
print("Tar: " + futtz.strftime("%Y/%m/%d %H:%M:%S"))
print("Dif: " + str(deltatz))

有输出:

Without timezone:
Now: 2021/10/05 14:22:27
Tar: 2021/12/31 23:59:59
Dif: 87 days, 10:37:31.187800

With timezone:
Now: 2021/10/05 14:22:27
Tar: 2021/12/31 23:59:59
Dif: 87 days, 10:37:31.187783

【讨论】:

请写两行关于问题所在以及您如何设法解决的问题。将对未来的读者有所帮助,:)。 @venky__ 这里的重点是正确使用localize。之前已经在 SO 上多次询问过这个问题(我链接的骗子只是一个例子); the docs 很清楚,我猜这不直观。 是的,这是骗人的。 localize 就是答案。虽然,这显然并不明显......基于具有相同问题的 ppl 数量。至少我学会了检查/测试我的代码,即使它很简单。

以上是关于带有时区信息的日期时间模块中的python timedelta计算[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 python 中最好地调整带有时区的时间戳?

具有相同时区信息的两个python日期时间对象的打印方式不同[重复]

获取带有时区偏移的日期

Python 中的日期可以感知时区吗?

带有时区和夏令时的纪元的日期和时间(以秒为单位)