不使用零填充的 Python 日期时间格式设置

有没有一种打印 Python 日期时间的格式不会在日期和时间上使用零填充?

我现在使用的格式:

mydatetime.strftime('%m/%d/%Y %I:%M%p')

结果: 02/29/201205:03 PM
期望: 2/29/20125:03 PM

什么样的格式将月份表示为’2’而不是’02’,时间表示为’5:03 PM’而不是’05:03 PM’

137352 次浏览

datetime.strftime()提供的格式选项将全部为0-pad。你当然可以滚动你自己的格式化函数,但是在这种情况下最简单的解决方案可能是后期处理 datetime.strftime()的结果:

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")

新的字符串格式化系统提供了 strftime的替代方案。它非常易读——实际上,在这个问题上它可能比 strftime更好。更不用说它不是“零垫”了:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

因为您可能希望在分钟字段中使用零填充,所以可以这样做:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

如果你想要“正常”的时间而不是“军事”的时间,你仍然可以使用标准的 strftime规范以及。为了方便起见,strftime 是的为12小时的时间提供了一个代码,其中用空格代替前导零:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

哎呀,这就变得不那么可读了。正如@mlissner 所指出的,strftime在某些情况下会失败(全部?)1900年以前的平台。

另一个避免上面“全部或没有”前导零方面的替代方法是在字段类型前面放置一个负号:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

然后这个: 2015年4月10日03:00 AM

成为: “4/10/20153:00 AM”

如果需要的话,你可以选择在一天的前面放一个减号。

编辑: 减号特性来源于 GNU C 库(“ Glibc”) ,正如 Linux strftime 手册中“ Glibc 注释”下提到的那样

Chris Freeman 对 Linux 的回答很好。

窗户上写着:

mydate.strftime('%#m/%#d/%Y')

我想这可能会有帮助。

接受回答不是一个正确的解决方案(IMHO)正确的记录方法:

在 Linux 中,“ #”被替换为“-”:

% d,% H,% I,% j,% m,% M,% S,% U,% w,% W,% y,% Y

在 Windows 中,“-”被替换为“ #”:

D,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% # Y

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')


# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

资料来源: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

如 Sagneta 所述: Windows 上的 # hash 技巧只对本地 Python 可执行文件可用。这不适用于基于 cygwin 的 python 实现。

“% 1”(小写的 L)按小时计费(而不是“% 1”) 从另一个答案中知道这一点

没有前导0的 Python strftime-date?

但不幸的是,他们没有日期/时间的其他元素的代码。

我用这个:

D = str(datetime.now().day)
MM = str(datetime.now().month)
YYYY = str(datetime.now().year)

今天,我们将回到2021年2月12日

正如其他一些人所提到的,要忽略窗口的前导0,必须使用 %#d而不是 %-d

对于那些喜欢编写干净的跨平台 python 代码的人来说,在业务逻辑中看不到平台切换,这里有一个 Python3帮助程序,它可以让你同时拥有一个针对 Windows、 Linux 和其他(测试过的 Linux、 Windows 和 FreeBSD)的格式字符串:

import os
from datetime import datetime


def dateToStr(d: datetime, fmt: str) -> str:
return d.strftime(fmt.replace('%-', '%#') if os.name == 'nt' else fmt)


dateToStr(datetime.now(), '%-m/%-d/%-Y')

值得注意的是,这是 Python 中的另一个 Whaaaaaaaat?特性。我不明白他们为什么不为所有平台创建一个标准格式集,并添加一个可选的“ use _ national”标志来使用本机平台特性。我猜这是一个早期的设计决定,必须保留遗留支持。

医生的正式格式部分:

  1. 当与 strptime ()方法一起使用时,% d、% m、% H、% I、% M、% S、% J、% U、% W 和% V 格式的前导零是可选的。

因此,使用 %d解析日数将自动解析 077,例如。