为什么使用"%-d"或"%-e"会去掉前导空格或零?

29

在SO问题904928(Python strftime-无前导0的日期?)中,Ryan回答道:

实际上我遇到了同样的问题,并意识到,如果在%和字母之间添加连字符,可以去除前导零。

例如%Y /%-m /%-d。

我也遇到了同样的问题,这是一个很好的解决方案,但是,为什么会出现这种情况呢?

>>> import datetime
>>> datetime.datetime(2015, 3, 5).strftime('%d')
'05'

>>> datetime.datetime(2015, 3, 5).strftime('%-d')
'5'

# It also works with a leading space
>>> datetime.datetime(2015, 3, 5).strftime('%e')
' 5'

>>> datetime.datetime(2015, 3, 5).strftime('%-e')
'5'

# Of course other numbers doesn't get stripped
>>> datetime.datetime(2015, 3, 15).strftime('%-e')
'15'

我找不到相关文档? -> Python日期时间文档 / Python字符串操作 似乎在Windows机器上无法正常工作,虽然我不使用Windows,但了解为什么无法正常工作会很有趣。

1
在我的 Windows 构建上,只有你的第一个示例可以正常运行。 其余的会导致“ValueError: Invalid format string”错误。 关于标准/可移植指令与特定于平台的“增强”方面,这个问题可能会给你一些启示。 - jedwards
所以这取决于每个操作系统的libc实现。谢谢!有关那些例子通常在Unix系统上如何工作的任何提示? - Mathias
1个回答

37

Python datetime.strftime()方法委托给平台相关的 C 库函数 strftime():

支持的完整格式代码集因平台而异,因为 Python 调用平台 C 库的 strftime() 函数,平台差异很常见。要查看您的平台支持的完整格式代码集,请参阅 strftime(3) 文档。

Glibc 关于 strftime(3) 的说明:

- (破折号) 不对数字结果字符串进行填充。

在我的 Ubuntu 计算机上运行的结果:

>>> from datetime import datetime
>>> datetime.now().strftime('%d')
'07'
>>> datetime.now().strftime('%-d')
'7'

如果你正在使用Linux,那么这很棒。但是当你在Windows上工作时应该怎么做呢? - Noctis Skytower
@NoctisSkytower 我猜在Windows上本来就不会有这个问题。如果它不支持时间格式中的减号,那么就不会有“为什么减号会删除任何东西”的问题。没有支持,就没有问题。 - jfs
18
在Windows上使用#代替-的提示可能对未来的读者有所帮助。 - Noctis Skytower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接