Python strftime - 没有前导0的日期?

415

在使用Python的strftime时,是否有一种方法可以去除日期前面的0(如果日期在10日之前),例如,将01变为1?找不到对应的%占位符来完成这个操作。

谢谢!

22个回答

806
其实我之前也遇到了同样的问题,后来我发现,如果在百分号(%)和字母之间加一个连字符,就可以去掉前导零。
例如:%Y/%-m/%-d
>>> import datetime
>>> datetime.datetime(2023, 1, 2).strftime("%Y/%-m/%-d")
'2023/1/2'

这只适用于Unix(Linux,OS X),不适用于Windows(包括Cygwin)。在Windows上,你会使用#,例如%Y/%#m/%#d

12
对我来说甚至都不起作用,出现一个 ValueError 错误(在 Windows 平台上,使用 Python 2.6)。 - rocketmonkeys
16
在我的OS X系统上,我使用的是从python.org下载的Python 2.7.2版本,这对我很有效。 - Tim Swast
14
@moose 我有一个关于这个问题的疑问 :-) 这里是答案 -> https://dev59.com/ZF4b5IYBdhLWcg3wnS0e - Mathias
19
وˆ‘éپ‡هˆ°ن؛†ValueError: '-' is a bad directive in format '%b %-d, %Y'çڑ„错误م€‚è؟™وک¯هœ¨OSXن¸ٹن½؟用Python 2.7و—¶ه‡؛çژ°çڑ„م€‚ - Richard
17
%#d 在 Windows 上也会有同样的作用。 - dalle
显示剩余16条评论

213

自从Python2.6以来,我们可以通过使用format方法来执行这种操作:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

虽然可能超出了原问题的范畴,但对于更有趣的格式,您可以进行以下操作:

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

从Python3.6开始,可以使用内联格式化字符串来表达:

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'

4
非常好!不幸的是,如果你想使用文本表示方法如time.strftime('%A %B %d, %Y'),它不能单独使用,这将产生(在英语环境下)Tuesday October 07, 2014的结果。 - Pekka Klärck
@PekkaKlärck -- 直到现在我才注意到你的评论。原来datetime指定了一个非常有趣的__format__钩子,允许你编写类似那样的东西。 - mgilson
4
一个问题是'{dt.hour}'使用的是24小时制钟表 :(. 使用第二个选项仍然需要在Windows上使用'{%#I}',在Unix上使用'{%-I}' - ubomb
好的观点。我从不在代码中使用12小时制表示,所以我没有考虑到那种情况。 - mgilson
我建议查看有关格式功能的附加文档:https://pyformat.info/ - Mark

46

一些平台可能支持在 % 和字母(比如 'd' 表示月份中的天数)之间指定宽度和精度,参考http://docs.python.org/library/time.html -- 但这明显不是可移植的解决方案(比如在我的 Mac 上不起作用;-)。也许你可以在使用 strftime 后使用字符串替换(或者正则表达式,对于非常复杂的格式)来解决这个问题?例如:

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'

@guneysus 你的意思是什么?它应该显示为“2000年1月1日”。 - User
9
@User 上述代码检查了“01 January 2000”中不存在的0前面的空格。 - Alagappan Ramu

40

这里是GNU C库中strftime()支持的修饰符的文档(就像之前有人说的,可能不可移植)。你可能感兴趣的是:

  • %e代替%d,将月份中的前导零替换为空格

Python文档中的strftime()格式代码进行比较。文档中记录了%d

%d:月份中的日期,以零填充的十进制数。 示例:01、02、…、31

但是%e没有记录。尽管没有记录,但在我的环境下(运行Linux),它似乎仍然有效:

>>> import datetime
>>> datetime.datetime(2023, 1, 1).strftime("%e")
' 1'

我不知道它是否适用于你的操作系统。

4
在Windows上使用Python 2.6时,我发现无法运行该程序。我猜这可能只适用于*nix系统。真遗憾 :( - rocketmonkeys
1
这是最干净、最通用的解决方案——至少在*nix系统上是如此。这在OS X上也可以工作。 - BFTM
1
像上面的 %-d 一样,这在使用 Python 2.7.2 的 OS X 10.8.5 中可以工作,但在使用 Python 2.7.3 的 Windows 7 Pro 64 位中不行。 - Johan
3
这对我在Windows 7 SP1上使用Python 3.5.1有效。 - Neil Billingham
1
适用于现代的pandas/python。 - johnDanger
显示剩余2条评论

37
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
这个有效 2000年1月1日,Alexs 不有效。 - guneysus
.replace('X0','X').replace('X','') 有什么意义呢?只需做 .replace('X0', '') 就可以了。 - Marco Bonelli
2
@MarcoBonelli:尝试在字符串“X12/X12/14”上尝试您的建议,您会看到结果。 - gdw2
4
这是一种“hack”,但它是符合Python编程风格的“hack”。 - Josh M.

26

25

虽然有些晚了,但是%-d在我的机器上可以工作。

datetime.now().strftime('%B %-d, %Y')会生成类似于"November 5, 2014"的东西。

干杯 :)


7
领先答案的副本?https://dev59.com/_HNA5IYBdhLWcg3wk-6A#2073189 - gdw2
4
在我的Windows系统中出现了ValueError: Invalid format string错误。 - Deqing
2
最佳答案所述,使用“-”符号“*仅适用于Unix(Linux、OS X),而不适用于Windows(包括Cygwin)。在Windows上,您应该使用#符号。” - Gino Mempin
同意,它在我的Windows上不起作用,但在Linux上可以。太疯狂了! - Timothy C. Quinn

11

请看下面的-

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)

在Python 3中完美运行。 - Saurabh
这应该是被接受的答案。完成了所要求的内容,非常简单易记。快速浏览文档后,我无法找到这些信息。 - Lucas Lima
10
这应该是被接受的答案。不,因为这仅适用于Linux操作系统。 - user136036

10
我觉得Django模板日期格式化过滤器很快、很容易使用。它会自动去掉前导零。如果您不介意导入Django模块,可以试试看。 http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    

请注意,如果您和我一样没有在Django中构建应用程序,则需要告诉Django您不需要配置它:import django.conf``django.conf.settings.configure() - Alex Pretzlav

8

只需要像这样使用replace

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

它会输出:

'2017/7/21'

很遗憾,这种方法无法处理像2021年4月1日这样格式化的日期;它可以捕获月份中的零,但对于日期(使用“01.04.2021” .replace(“.0”,“。”)仅导致01.4.2021)则不行。 - Michal Skop

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