【问题标题】:Does python time.strftime process timezone options correctly (for RFC 3339)python time.strftime 是否正确处理时区选项(对于 RFC 3339)
【发布时间】:2017-12-03 19:56:11
【问题描述】:

我正在尝试使用 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'等

除了编写代码以获取 %z 输出并将其重新格式化为 %:z 格式之外,是否有任何解决方法(例如,另一个 python 模块,或者我在“时间”模块中缺少的某些选项)来解决这个问题?

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

【问题讨论】:

标签: python time strftime


【解决方案1】:

对标题“python time.strftime 是否正确处理时区选项(对于 RFC3339)?”中问题的严格回答是:没有。

Linux 'date' 命令支持的“%:z”是一个 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 不支持)

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 2014-02-18
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多