带有时区信息的日期时间模块中的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中的日期时间?