没有零填充的Python日期时间格式

Yar*_*rin 70 python formatting datetime zero-pad

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

格式我现在正在使用:

mydatetime.strftime('%m/%d/%Y %I:%M%p')
Run Code Online (Sandbox Code Playgroud)

结果: 02/29/2012 05:03 PM
期望: 2/29/2012 5:03 PM

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

Chr*_*man 108

避免上述"全部或全部"前导零方面的另一个替代方法是在字段类型前面放置一个减号:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')
Run Code Online (Sandbox Code Playgroud)

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

成为:'2015年4月10日凌晨3:00'

如果需要,您可以选择在当天前面减去一个减号.

  • 很好的答案,但只有Linux.无法在Windows上运行.http://stackoverflow.com/questions/10807164/python-time-formatting-different-in-windows (25认同)
  • 为什么这有效?我在“date.__format__”或“time.strftime”的文档中找不到对此的引用,https://docs.python.org/3/library/datetime.html#datetime.date.__format__,以及分别 https://docs.python.org/3.8/library/time.html#time.strftime (5认同)
  • 这实际上是正确的答案,并且可以在其他系统(例如matplotlib和pandas)中使用。 (2认同)
  • @Amin Shah Gilani,这是 Linux 派生的替代方案,我已更新该帖子以链接到此实现特定功能的起源。 (2认同)

sen*_*rle 88

新的字符串格式化系统提供了替代方案strftime.它非常易读 - 事实上,它可能更适合strftime该帐户.更不用说它没有零填充的事实:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'
Run Code Online (Sandbox Code Playgroud)

由于您可能希望在分钟字段中填充零,您可以这样做:

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

如果你想要"常规"时间而不是"军事"时间,你仍然可以使用标准strftime说明符.方便的是,为了我们的目的,strftime 确实提供了12小时的代码填充空白而不是前导零:

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

唉,这变得不那么可读了.正如@mlissner指出的那样,strftime在1900年之前的某些(所有?)平台上会失败.

  • 例如,要拼出月份,你可以使用以下内容:`"{0.day} {0:%B%Y}".格式(d)`这将给你''2013年8月2日''作为这个评论的一天:) (3认同)
  • 它从 python 2.6 就已经存在了。(这不是什么新鲜事。) (2认同)
  • 这很有意思,但它实际上并没有回答OP,因为他想要AM/PM小时.我实际上并没有打算投票,但如果你试图在python中获得"美国"日期/时间格式,那么接受的答案实际上是正确的. (2认同)

Sve*_*ach 62

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

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

(也就是说,如果你认为这样做真的值得麻烦.为什么不简单地留下零?)

  • 在手工编写时间时,很少有人在北美使用零填充小时. (3认同)
  • 这月的这一天不会是零填充吗? (2认同)

小智 38

接受的答案不是一个正确的解决方案(恕我直言)适当的记录方法:

在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')
Run Code Online (Sandbox Code Playgroud)

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

正如Sagneta所说:Windows上的#hake技巧仅适用于本机python可执行文件.这对基于cygwin的python实现不起作用.

  • 这是对的.但请注意,Windows上的#hake技巧仅适用于本机python可执行文件.换句话说,这对基于cygwin的python实现不起作用. (3认同)
  • 哇,这真是太好了,但我对后果感到震惊。我正在测试从数据库返回的日期格式,我需要为每个测试传递期望的格式,这会增加大量的复杂性。 (2认同)

use*_*285 10

Chris Freeman在Linux上的很好回答。

在Windows上,它是:

mydate.strftime('%#m/%#d/%Y')
Run Code Online (Sandbox Code Playgroud)

认为可能会有所帮助。