在开始时将变量分配给 ZoneInfo("US/Eastern") 并永久重复使用它,而不会出现夏令时问题?

问题描述 投票:0回答:1

创建日期时间对象时,我在 python 代码中重复使用相同的时区。 到目前为止,我每次都只是创建一个新的 ZoneInfo 对象,类似于:

dt = datetime.now(tz=ZoneInfo("US/Eastern"))

我认为为了确保它准确跟踪夏令时,这些开销是值得的。 但现在我发现自己经常使用它,包括经常迭代数百个结果。 我想知道,如果我只是创建一个包含我通常使用的时区的文件,例如:

# compononets/common/freq_tz.py
from zoneinfo import ZoneInfo
tz_us_east = ZoneInfo("US/Eastern")

并将其导入我的代码中:

from components.common.freq_tz import *

始终重用它,而无需每次都重新创建对象。

我唯一担心的是该程序可能会运行数周或数月,在此期间,夏令时可能会将时区的时差更改为 UTC。如果我仍然使用我在开始时、几周或几个月前创建的同一对象...我不确定当夏令时发生变化时它是否会导致问题。

我无法对此进行测试,因为它需要在夏令时更改发生时进行此操作。

python datetime zoneinfo
1个回答
0
投票

无论何时创建,时区对象都不会更改。否则,如果 DST 在它们之间的微秒内发生变化,即使这两行也可能有问题:

tz = ZoneInfo('US/Eastern')
dt = datetime.now(tz=tz)

不,它是

datetime
对象,它根据需要从时区对象中读取与所需时间相关的 DST 信息:

dt = datetime(2024, 1, 1, 10, 42, tzinfo=tz)
dt = datetime(1983, 7, 7, 12, 8, tzinfo=tz)
dt = datetime(2050, 12, 24, 9, 1, tzinfo=tz)

仅实例化一次是完全安全的。

创建一个包含全部时区对象的单独模块是否是一个好主意是另一个问题。对于一些不存在的微优化来说,这听起来过于复杂。在您需要的代码附近实例化时区听起来是更好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.