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

时间:2017-06-29 23:39:43

标签: python time strftime

我正在尝试使用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输出的其他模块提供解决方案。我将使用我在标题中找到的信息自我回答。

1 个答案:

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