python time.strftime是否正确处理时区选项(对于RFC 3339)

Does python time.strftime process timezone options correctly (for RFC 3339)

我正在尝试使用time.strftime()函数从python的时间模块获得RFC3339兼容输出。

使用Linux'date'命令,我可以使用如下格式字符串:"date +%F_%T%:z"

1
2
$ date +%F_%T%:z
2017-06-29_16:13:29-07:00

与python time.strftime一起使用时,%:z似乎不受支持。

1
2
3
4
$ python
>>> import time
>>> print time.strftime("%F %T%:z")
2017-06-29 16:16:15%:z

显然,'%z'受支持,但'%:z'不支持:

1
2
>>> print time.strftime("%F %T%z")
2017-05-29 16:15:35-0700

RFC3339专门使用嵌入冒号的时区偏移量。
在我的情况下,这将是07:00,而不是0700。

我认为省略对"%:z"选项的支持是由于strftime()的底层C实现不支持带冒号的时区偏移格式化程序的版本。即'%:z','%:: z'等

有没有解决方法(例如另一个python模块,或'time'模块中缺少的一些选项),除了编写代码以获取%z输出并重新格式化为%:z格式,以解决此问题?

编辑:另一个问题(在Python中生成RFC 3339时间戳)为可用于输出RFC3339输出的其他模块提供解决方案。我将使用我在标题中找到的信息自我回答。


严格回答标题"python time.strftime进程时区选项是否正确(对于RFC3339)?"没有。

Linux'date'命令支持的"%:z"是GNU扩展,不在POSIX规范中,也不在strftime的C实现中(在撰写本文时)。

关于变通方法(在问题正文中请求),Python中生成RFC 3339时间戳的答案可以用作替代time.strftime来输出符合RFC3339的软件。

具体来说,我使用pytz模块获取时区信息,并使用datetime类isoformat()函数以RFC3339兼容格式打印(在输出的时区偏移部分使用冒号)。像这样:
(在Ubuntu 14.04上的Python 2.7中)

1
2
3
4
5
6
7
8
>>> import pytz, datetime
>>> latz = pytz.timezone("America/Los_Angeles")
>>> latz
<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>
>>> dt = datetime.datetime.now(latz)
>>> dt2 = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, latz)
>>> dt2.isoformat()
'2017-07-06T11:50:07-08:00'

注意从dt到dt2的转换,将微秒设置为0.这可以防止isoformat在isoformat输出中以秒的小数部分打印微秒(RFC3339不支持)