Python:strftime()UTC偏移量在Windows中未按预期工作

Python:strftime()UTC偏移量在Windows中未按预期工作,python,windows,offset,utc,strftime,Python,Windows,Offset,Utc,Strftime,每次我使用: time.strftime("%z") 我得到: Eastern Daylight Time 但是,我希望UTC偏移量的形式为+HHMM或-HHMM。我甚至试过: time.strftime("%Z") 这仍然产生: Eastern Daylight Time 我读过其他几篇与strftime()相关的文章,%z似乎总是以正确的+HHMM或-HHMM格式返回UTC偏移量。对于python 3.3,如何使strftime()以+HHMM或-HHMM格式输出 编辑:我正在运行W

每次我使用:

time.strftime("%z")
我得到:

Eastern Daylight Time
但是,我希望UTC偏移量的形式为+HHMM或-HHMM。我甚至试过:

time.strftime("%Z")
这仍然产生:

Eastern Daylight Time
我读过其他几篇与strftime()相关的文章,%z似乎总是以正确的+HHMM或-HHMM格式返回UTC偏移量。对于python 3.3,如何使strftime()以+HHMM或-HHMM格式输出


编辑:我正在运行Windows 7,有关正确的解决方案,请参阅。


可以使用以秒为单位返回负偏移量的。例如,我现在在CEST(UTC+2),因此我得到以下结果:

>>> time.altzone
-7200
并将其转换为您想要的格式:

>>> '{}{:0>2}{:0>2}'.format('-' if time.altzone > 0 else '+', abs(time.altzone) // 3600, abs(time.altzone // 60) % 60)
'+0200'

正如注释中提到的那样,
time.altzone
给出了DST激活时的偏移量,而
time.timezone
给出了DST未激活时的偏移量。要想知道该用哪一个,你可以按照J.F.塞巴斯蒂安的建议去做。因此,您可以获得如下所示的正确偏移:

time.altzone if time.daylight and time.localtime().tm_isdst > 0 else time.timezone
正如他所建议的那样,您可以在Python 3中使用以下内容来获得所需的格式:


使用
time.timezone
以秒为单位获取时间偏移

使用以下格式对其进行格式化:

("-" if time.timezone > 0 else "+") + time.strftime("%H:%M", time.gmtime(abs(time.timezone)))
将其转换为+/-HH:MM格式

顺便说一句,这不是一个错误吗?根据
strftime

我也这么认为,这个答案可能会帮助您将区域偏移量字符串转换为HH:MM格式。但是由于
“%z”
没有按预期工作,我觉得它没有意义


注意:不受夏令时的影响。

在2.x中,如果您查看文档,它们甚至没有提到
%z
。它根本不能保证存在,更不用说跨平台的一致性了。实际上,正如所暗示的,它由C
strftime
函数决定。在另一方面,他们确实提到了
%z
,而解释它没有按照您预期的方式工作的脚注并不容易看到;那太好了

但是,在2.6+(包括所有3.x版本)中,保证将
%z
支持为“UTC偏移量的形式为+HHMM或-HHMM(如果对象是未初始化的,则为空字符串)。”因此,这使得解决方法非常简单:使用
datetime
而不是
time
。具体如何更改取决于您正试图执行的操作-使用
tz
然后使用
datetime.now(tz.tzlocal())。strftime(“%z”)
是将本地时区格式化为GMT偏移量的方法,但如果您正试图格式化完整的时间,则详细信息会有所不同


如果查看源代码,基本上只需检查格式字符串是否对平台说明符有效,并调用本机的
strftime
函数,同时对不同的说明符进行一系列特殊处理,包括
%z
;特别是,在将内容传递到strftime之前,它将使用格式化版本的
utcoffset
替换
%z
。自2.7版以来,代码已经更改了几次,甚至被彻底重新组织了一次,但即使在3.5版之前的主干中,基本上也存在相同的差异。

这一错误持续存在并不奇怪,目前可用的最新Windows版本是什么,Win 10 version 1703(Creators)。然而,随着时间的推移,有一个可爱的日期和时间库,名为,它满足了问题的要求。塞巴斯蒂安·尤斯塔斯(该产品的主要作者?)向我展示了这一点

>>> pendulum.now().strftime('%z')
'-0400'
钟摆假定UTC/GMT,除非另有说明,并使用日期时间对象保留时区。还有许多其他可能性,其中包括:

>>> pendulum.now(tz='Europe/Paris').strftime('%z')
'+0200'
>>> pendulum.create(year=2016, month=11, day=5, hour=16, minute=23, tz='America/Winnipeg').strftime('%z')
'-0500'
>>> pendulum.now(tz='America/Winnipeg').strftime('%z')
'-0500'

我无法重现您在[2]中观察到的:
:time.strftime(“%z”)Out[2]:“-0500”
。你能告诉我们更多的细节吗?你在说什么。@PatrickCollins我也没有得到偏移量,而是
'Mitteleuropäische Sommerzeit'
(Windows 8、Python 2.7、3.3和3.4)。我在Windows 7上得到了类似的结果
time.strftime(“%z”)->“东部夏时制”
对于Python 2.6.6、2.7.2、3.2.2,不幸的是,Windows下的库不支持
%z
,Python依赖于这些库。查看窗口的错误结果,了解
%z
是一个开放性错误:这是一个很好的答案。我进行了编辑,因为您的代码有一些语法错误。我认为还值得指出MarkRansom的评论:“不幸的是,Windows下的库不支持%z,Python依赖于这些库。请参阅msdn.microsoft.com/en us/library/fe06s4ak.aspx”@ra即使您尝试的编辑也没有修复任何问题,因此被拒绝<代码>/是整数除法,在Python中是有效的操作。您的编辑破坏了代码以生成所需的输出。这很奇怪。当您的代码失败时,我的编辑运行正常。但是,我正在运行Python 3。我想你是在运行Python 2吗?@Raeven不,它在Python 3和Python 2上都能工作。你犯了什么错误?我得收回。现在对我有用了。我第一次一定没有完全复制您的文本。在Python 3上,仅使用stdlib:
datetime.now(timezone.utc).astimezone().strftime(“%z”)
考虑到这个问题询问的是东部夏时制的偏移量,我认为他不想“对夏时制免疫”。(不幸的是,我认为这个问题没有明确说明他到底想要什么,但我认为这不是问题所在。)
>>> pendulum.now(tz='Europe/Paris').strftime('%z')
'+0200'
>>> pendulum.create(year=2016, month=11, day=5, hour=16, minute=23, tz='America/Winnipeg').strftime('%z')
'-0500'
>>> pendulum.now(tz='America/Winnipeg').strftime('%z')
'-0500'