格式'%e %B %Y'中的'e'指令不正确

3 投票
3 回答
8670 浏览
提问于 2025-04-18 12:12

我正在尝试把一个格式为“DD MM YYYY”的字符串转换成日期时间对象。我希望输出中的日期部分,如果日期是个位数,就只显示一个数字。例如,输入'1 May 2014'在转换成日期时间对象后应该显示为'1 May 2014',而不是'01 May 2014'。

为此,我使用了% e格式来转换输出日期中的日期部分。以下是相关的代码:

import datetime
from datetime import timedelta

s = "1 July 2013"
d = datetime.datetime.strptime(s, "%e %B %Y")  

print d.strftime("%e %B %Y")

但是,我遇到了以下错误:

ValueError: 'e' is a bad directive in format '%e %B %Y'

格式上有什么问题吗?我使用的是Python 2.7,如果这有帮助的话。

3 个回答

2

看起来没有直接的指令可以满足你的需求。你可以选择使用零填充,或者把最后一行改成 print d.strftime("%d %B %Y").lstrip('0')

5

你可以把字符串格式化和属性访问混合在一起,使用 strftime 风格的 str.format 方法,比如:

from datetime import datetime

s = "1 July 2013"
d = datetime.strptime(s, "%d %B %Y")
 # 2013-07-01 00:00:00
out = '{0.day} {0:%B %Y}'.format(d)
# 1 July 2013
7

%e 这个格式代码并不是 Python 的 datetime.strftime 一定能处理的格式。你可以查看 这里的表格,了解 Python 确保支持的格式代码。不过,由于 CPython 的 strftime 是调用底层 C 库的 strftime,在某些操作系统上,比如 Linux,%e 格式代码是存在的


CPython 源代码 中提到:

你所在的平台可能还有其他代码可用。请查看 C 库 strftime 函数的文档。


没有其他格式代码(保证存在)能像 %e 那样工作。所以如果你的系统没有 %e,或者你想让你的代码在不同平台上都能用,建议使用字符串格式化,正如 ZacrathJon Clements 所示。

撰写回答