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

每次我使用:

time.strftime("%z") 

我得到:

 Eastern Daylight Time 

不过,我希望UTC偏移量的forms为+ HHMM或-HHMM。 我甚至尝试过:

 time.strftime("%Z") 

这仍然产生:

 Eastern Daylight Time 

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

编辑:我正在运行Windows 7

Solutions Collecting From Web of "Python:strftime()UTC偏移按照预期在Windows中不工作"

有关正确的解决方案,请参阅下面的abarnert的答案 。


你可以使用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' 

如注释中提到的那样, 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' 

在2.x中,如果查看time.strftime的文档,他们甚至不提及 %z 。 不能保证存在,更不用说跨平台一致。 事实上,正如脚注1所暗示的那样,它是由C strftime函数决定的。 另一方面,在3.x中 ,他们提到了%z ,脚注解释了它不能按照你期望的方式工作,这是不容易的。 这是一个开放的错误 。

但是,在2.6+(包括所有的3.x版本)中, datetime.strftime保证支持%z为“UTC + HHMM或者-HHMM形式的UTC偏移量(如果对象是天真的,则为空字符串)”。 所以,这是一个非常简单的解决方法:使用datetime time而不是time 。 究竟如何改变事情取决于你想要做什么 – 使用Python-dateutil tz然后datetime.now(tz.tzlocal()).strftime('%z')是获取格式化本地时区的方式作为格林尼治标准时间的偏移量,但如果你想格式化一个完整的时间细节将有所不同。

如果您查看源代码, time.strftime基本上只是检查格式字符串是否为有效的平台说明符,并调用本地的strftime函数,而datetime.strftime对不同的说明符有一堆特殊处理,包括%z ; 特别是在将事件传递给strftime之前,它将用一个格式化的utcoffset版本替换%z 。 代码从2.7开始改变了几次,甚至被彻底重组了一次,但是在3.5之前的主干中基本上也存在差异。

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

格式化使用:

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

将其转换为+/- HH:MM格式。

顺便说一句,这不应该是一个错误? 根据strftime 文档 。

此外,我认为这个答案可能会帮助你从区域偏移字符串转换为HH:MM格式。 但是由于"%z"没有按预期工作,所以我觉得它没有实际意义。

注意: time.timezone不受time.timezone时制的限制。

这个问题一直不会让人惊讶,目前最新的Windows版本是什么,Win 10 Version 1703(Creators)。 然而,时间流逝,并有一个可爱的日期和时间库称为钟摆 ,做问题的要求。 SébastienEustace(该产品的主要作者?)向我展示了这一点。

 >>> 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'