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

2024-05-15 21:49:08 发布

您现在位置: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格式输出?

编辑:我正在运行Windows7


Tags: 编辑time格式文章偏移量utceasternstrftime
3条回答

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

格式使用:

("-" if time.timezone > 0 else "+") + time.strftime("%H:%M", time.gmtime(abs(time.timezone)))

将相同的格式转换为+/-HH:MM格式。

顺便问一下,这不应该是个错误吗?根据strftimedocs

我还认为this所以答案可能有助于您从区域偏移字符串转换为HH:MM格式。但是由于"%z"没有按预期工作,我觉得它没有什么意义。

注意:^{}不受日光节约的影响。

在2.x中,如果您查看^{}的文档,它们甚至都不会提到%z。它根本不能保证存在,更不能保证跨平台的一致性。事实上,正如footnote 1所暗示的,它由Cstrftime函数决定。另一方面,在3.x中,他们确实提到了%z,而且解释它不能以您期望的方式工作的脚注也不容易看到;这就是an open bug

但是,在2.6+(包括所有3.x版本)中,^{}保证支持%z作为“格式为+HHMM或-HHMM(如果对象是纯字符串,则为空字符串)的UTC偏移量”。因此,这使得解决方法非常简单:使用datetime,而不是time。确切地说,如何改变取决于你到底想做什么-使用Python-dateutiltz然后datetime.now(tz.tzlocal()).strftime('%z')是获得格式为GMT偏移量的本地时区的方法,但是如果你试图格式化一个完整的时间,则细节会有点不同。

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

有关正确的解决方案,请参见abarnert’s answer below


您可以使用^{},它以秒为单位返回负偏移量。例如,我现在正在使用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不处于活动状态时给出偏移量。要想知道使用哪个,可以按照J.F.Sebastian的建议in his answer to a different question。这样就可以得到正确的偏移:

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'

相关问题 更多 >