不带零填充的Python日期时间格式


90

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

我现在使用的格式:

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

结果: 2012年2月29日下午5:03
所需 2012年2月29日下午5:03

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

Answers:


77

可用的格式化选项datetime.strftime()将全部为零填充。您当然可以滚动使用自己的格式化功能,但是在这种情况下,最简单的解决方案可能是对以下结果进行后处理datetime.strftime()

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

1
Sven-因为我想看起来像Facebook。谢谢!
Yarin 2012年

4
手工书写时间时,很少有人在北美使用零填充时间。
Eric Walker

2
这个月的一天还不是零垫吗?
法官Maygarden 2014年

1
@JudgeMaygarden:这就是为什么该解决方案.lstrip("0")可以摆脱前导零的原因。
Sven Marnach 2014年

1
为什么我要删除填充零?因为这是RFC 2822的错误,例如在播客feed中。
Vitaly Zdanevich '19

165

避免上述“全有或全无”的前导零表示的另一种替代方法是在字段类型前面放置一个减号:

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

然后这样:“ 4/10/2015 03:00 AM”

变为:“ 4/10/2015 3:00 AM”

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

编辑:减号功能源自GNU C库(“ glibc”),如Linux strftime联机帮助页“ Glibc注释”下所述。


48
很好的答案,但仅限Linux。在Windows上将无法使用。stackoverflow.com/questions/10807164/...
ExactaBox

1
为什么这样做?我无法找到的文档的这一参考date.__format__time.strftimedocs.python.org/3/library/...docs.python.org/3.8/library/time.html#time.strftime分别
阿明·沙阿·吉拉尼

1
@AminShahGilani帖子使用src参考进行了更新
ChrisFreeman

93

新的字符串格式系统提供了的替代方法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'

becomes,这变得有点难以理解。正如@mlissner所指出的那样,strftime在某些(所有?)平台上,1900年之前的日期将失败。


1
从python 2.6开始就已经存在了。(不是那么新。)
senderle 2012年

3
例如,要说出月份,您可以使用以下命令:"{0.day} {0:%B %Y}".format(d)将其'2 August 2013'作为评论的日期:)
Jens

2
这很有趣,但实际上并不能回答OP,因为他想要AM / PM小时。我实际上并不会对此投票,但是如果您尝试使用python获取“美国”日期/时间格式,则可以接受的答案是正确的。
Dana Cartwright 2014年

请注意,该技术使用strftime,它将在1900年之前的日期上失败。如果您使用的是旧日期,您将为此感到后悔。
mlissner '16

1
ak!我只是意识到我没有将d指向另一个对象的地方,而是将其作为位置arg传递了。
JacobIRR

50

接受的答案不是适当的解决方案(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上的#哈希技巧仅适用于本机python可执行文件。这不适用于基于cygwin的python实现。


3
这是对的。但是请注意,Windows上的#哈希技巧仅适用于本机python可执行文件。换句话说,这不适用于基于cygwin的python实现。
sagneta

2
哇,我很高兴知道这一点,但我对后果感到震惊。我正在测试从数据库返回的日期格式,因此我需要为每个测试传递期望的格式,这会增加大量的复杂性。
基思

10

Chris Freeman在Linux上的很好回答。

在Windows上,它是:

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

认为可能会有所帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.