您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

在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'
python 2022/1/1 18:31:54 有225人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶