gpt4 book ai didi

python - 使用本地时区在 Python 中获取正确的时区偏移量

转载 作者:IT老高 更新时间:2023-10-28 21:00:06 28 4
gpt4 key购买 nike

好的,首先让我说我的时区是 CET/CEST。它从 CEST 变为 CET(从 DST(即 GMT+2)返回到正常(即 GMT+1))的确切时刻始终是 10 月的最后一个星期日凌晨 3 点。 2010 年是 10 月 31 日凌晨 3 点。

现在请注意以下几点:

>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)

如上所述,这是错误的。

>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)

现在突然正确了:/

我知道已经有几个问题,但给出的解决方案始终是“使用本地化”,但我的问题是 LocalTimezone 不提供该方法。

事实上,我有几个以毫秒为单位的时间戳,我需要本地时区的 utcoffset(不仅是我的,而是任何使用该程序的人)。其中之一是我的时区中的 1288483950000 或 Sun Oct 31 2010 02:12:30 GMT+0200 (CEST)。

目前我执行以下操作来获取日期时间对象:

datetime.datetime.fromtimestamp(int(int(millis)/1E3)) 

这可以在几分钟内获得 utcoffset:

-int(local_tnz.utcoffset(date).total_seconds()/60)

不幸的是,这在很多情况下都是错误的:(。

有什么想法吗?

注意:我使用的是 python3.2.4,在这种情况下并不重要。

编辑:

感谢@JamesHolderness,找到了解决方案:

def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))

def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)

local_tz 等于 tzlocal 模块中的 tzlocal.get_localzone()。

最佳答案

根据Wikipedia ,夏令时的转换发生在 01:00 UTC。

  • 在 00:12 UTC 时,您仍处于中欧夏令时(即 UTC+02:00),因此本地时间为 02:12。

  • 在 01:12 UTC,您又回到标准的欧洲中部时间(即 UTC+01:00),因此本地时间又是 02:12。

从夏令时改回标准时间时,本地时间会从 02:59 变回 02:00,并且小时会重复。因此,当询问 02:12(本地时间)的 UTC 偏移量时,答案可能是 +01:00 或 +02:00 - 这取决于您所谈论的 02:12 版本。

在进一步调查 pytz 库时,我认为您的问题可能是您不应该使用 pytz.reference 实现,它可能无法很好地处理这些歧义。引用源代码中的注释:

Reference tzinfo implementations from the Python docs. Used for testing against as they are only correct for the years 1987 to 2006. Do not use these for real code.

在 pytz 中处理模棱两可的时间

你应该做的是为适当的时区构造一个 timezone 对象:

import pytz
cet = pytz.timezone('CET')

然后您可以使用 utcoffset 方法来计算该时区中日期/时间的 UTC 偏移量。

dt = datetime.datetime(2010, 10, 31, 2, 12, 30)
offset = cet.utcoffset(dt)

请注意,上面的示例将抛出 AmbiguousTimeError 异常,因为它无法判断您指的是 02:12:30 的两个版本中的哪一个。幸运的是,pytz 会让你通过设置 is_dst 参数来指定你想要 dst 版本还是标准版本。例如:

offset = cet.utcoffset(dt, is_dst = True)

请注意,在所有对 utcoffset 的调用中设置此参数并没有什么害处,即使时间不会有歧义。根据文档,它仅在 DST 过渡模糊期使用以解决这种模糊性。

如何处理时间戳

至于处理时间戳,最好尽可能长时间地将它们存储为 UTC 值,否则最终可能会丢弃有值(value)的信息。所以首先使用 datetime.utcfromtimestamp 方法转换为 UTC 日期时间。

dt = datetime.datetime.utcfromtimestamp(1288483950)

然后使用 pytz 将时间本地化为 UTC,因此时区附加到 datetime 对象。

dt = pytz.utc.localize(dt)

最后,您可以将该 UTC 日期时间转换为您的本地时区,并获取时区偏移量,如下所示:

offset = dt.astimezone(cet).utcoffset()

请注意,这组计算将为 1288483950 和 1288487550 生成正确的偏移量,即使这两个时间戳都由 CET 时区中的 02:12:30 表示。

确定本地时区

如果您需要使用计算机的本地时区而不是固定时区,则不能直接从 pytz 执行此操作。您也不能只使用 time.tzname 中的时区名称构造一个 pytz.timezone 对象,因为 pytz 并不总是能够识别名称。

解决方案是使用 tzlocal module - 它的唯一目的是在 pytz 中提供这个缺失的功能。你可以这样使用它:

import tzlocal
local_tz = tzlocal.get_localzone()

get_localzone() 函数返回一个 pytz.timezone 对象,因此您应该能够在我使用过 的所有地方使用该值上面示例中的 cet 变量。

关于python - 使用本地时区在 Python 中获取正确的时区偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17733139/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com