每次使用:
time.strftime("%z")
我得到:
Eastern Daylight Time
但是,我想使用+ HHMM或-HHMM形式的UTC偏移量。我什至尝试过:
time.strftime("%Z")
仍然会产生:
我已经阅读了与strftime()相关的其他几篇文章,%z似乎总是以正确的+ HHMM或- HHMM格式返回UTC偏移量。如何获取strftime()以python 3.3的+ HHMM或-HHMM格式输出?
编辑:我正在运行Windows 7
要获得适当的解决方案,请参见下面的abarnert答案。
在2.x中,如果您查看文档time.strftime,他们甚至不会提及 %z。它根本不能保证存在,更不用说跨平台保持一致了。实际上,正如脚注1所示,它留给了Cstrftime函数。另一方面,在3.x中,他们确实提到了%z,并且脚注解释了它不能按照您期望的方式工作,这很难理解。那是一个开放的错误。
time.strftime
%z
然而,在2.6+(包括所有3.x的版本),则保证支持为“UTC形式+偏移HHMM或-HHMM(如果该对象是幼稚空字符串)”。因此,这提供了一个非常简单的解决方法:使用而不是。究竟如何更改内容取决于您要执行的操作-使用Python-dateutil然后是将本地时区格式化为GMT偏移量的方法,但是如果您要格式化完整的时间,则详细信息将有所不同。datetime.strftime %zdatetimetime tzdatetime.now(tz.tzlocal()).strftime('%z')
Python-dateutil
datetime.strftime %zdatetimetime tzdatetime.now(tz.tzlocal()).strftime('%z')
如果您查看源代码,则time.strftime基本上只是检查适用于平台的说明符的格式字符串并调用本机strftime函数,而datetime.strftime对于不同的说明符则有很多特殊处理,包括%z; 特别是,它将在将内容传递给之前%z用的格式版本替换。自2.7版以来,该代码已进行了几次更改,甚至进行了一次彻底的重组,但即使在3.5版之前的主干中,也基本上存在相同的区别。utcoffsetstrftime
datetime.strftime
utcoffsetstrftime
您可以使用time.altzone,以秒为单位返回负偏移量。例如,我目前正在CEST(UTC + 2)上,所以我得到了:
time.altzone
>>> 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.timezone
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'