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不支持)