我正在尝试使用time.strftime()函数从python的时间模块获得RFC3339兼容输出。
使用Linux'date'命令,我可以使用如下格式字符串:“date +%F_%T%:z”
$ date +%F_%T%:z
2017-06-29_16:13:29-07:00
当与python time.strftime一起使用时,%:z似乎不受支持。
$ python
>>> import time
>>> print time.strftime("%F %T%:z")
2017-06-29 16:16:15%:z
显然,'%z'受支持,但'%:z'不支持:
>>> 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格式,以解决这个问题?
编辑:另一个问题(Generate RFC 3339 timestamp in Python)为可用于输出RFC3339输出的其他模块提供解决方案。我将使用我在标题中找到的信息自我回答。
答案 0 :(得分:1)
标题中问题的严格答案" python time.strftime是否正确处理时区选项(对于RFC3339)?"是:否。
"%:z" Linux' date'支持command是一个GNU扩展,不在POSIX规范中,也不在strftime的C实现中(截至本文撰写时)。
关于变通方法(在问题正文中请求),Generate RFC 3339 timestamp in Python中的答案可用作替代time.strftime以输出符合RFC3339的软件。
具体来说,我使用pytz模块获取时区信息,并使用datetime类isoformat()函数以RFC3339兼容格式打印(在输出的时区偏移部分使用冒号)。像这样: (在Ubuntu 14.04上的Python 2.7中)
>>> 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不支持)