小编典典

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

python

每次使用:

time.strftime("%z")

我得到:

Eastern Daylight Time

但是,我想使用+ HHMM或-HHMM形式的UTC偏移量。我什至尝试过:

time.strftime("%Z")

仍然会产生:

Eastern Daylight Time

我已经阅读了与strftime()相关的其他几篇文章,%z似乎总是以正确的+ HHMM或-
HHMM格式返回UTC偏移量。如何获取strftime()以python 3.3的+ HHMM或-HHMM格式输出?

编辑:我正在运行Windows 7


阅读 243

收藏
2021-01-20

共1个答案

小编典典

要获得适当的解决方案,请参见下面的abarnert答案。

在2.x中,如果您查看文档time.strftime,他们甚至不会提及 %z。它根本不能保证存在,更不用说跨平台保持一致了。实际上,正如脚注1所示,它留给了Cstrftime函数。另一方面,在3.x中,他们确实提到了%z,并且脚注解释了它不能按照您期望的方式工作,这很难理解。那是一个开放的错误。

然而,在2.6+(包括所有3.x的版本),则保证支持为“UTC形式+偏移HHMM或-HHMM(如果该对象是幼稚空字符串)”。因此,这提供了一个非常简单的解决方法:使用而不是。究竟如何更改内容取决于您要执行的操作-使用Python-dateutil然后是将本地时区格式化为GMT偏移量的方法,但是如果您要格式化完整的时间,则详细信息将有所不同。datetime.strftime %zdatetimetime tzdatetime.now(tz.tzlocal()).strftime('%z')

如果您查看源代码,则time.strftime基本上只是检查适用于平台的说明符的格式字符串并调用本机strftime函数,而datetime.strftime对于不同的说明符则有很多特殊处理,包括%z; 特别是,它将在将内容传递给之前%z用的格式版本替换。自2.7版以来,该代码已进行了几次更改,甚至进行了一次彻底的重组,但即使在3.5版之前的主干中,也基本上存在相同的区别。utcoffsetstrftime


您可以使用time.altzone,以秒为单位返回负偏移量。例如,我目前正在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'

如评论中提到的abarnert所示,time.altzone当DST处于活动状态时给出偏移量,而time.timezone在DST不处于活动状态时给出偏移量。要弄清楚使用哪个,您可以按照JF
Sebastian在回答其他问题时所建议的那样进行操作。因此,您可以像这样获得正确的偏移量:

time.altzone if time.daylight and time.localtime().tm_isdst > 0 else time.timezone

正如他所建议的那样,您可以在Python
3中使用以下代码通过datetime.timezone获得所需的格式:

>>> datetime.now(timezone.utc).astimezone().strftime('%z')
'+0200'
2021-01-20