Python strftime-日期前无0?


277

使用Python时strftime,有一种方法可以删除日期的第一个0(如果它在10之前)。所以011?找不到%东西吗?

谢谢!

Answers:


568

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

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

这仅适用于Unix(Linux,OS X),而不适用于Windows(包括Cygwin)。在Windows上,您可以使用#,例如%Y/%#m/%#d


11
甚至对我都不起作用,给出了ValueError(windows,python 2.6)
rocketmonkeys 2010年

14
它在OS X上对我有用,但是我正在使用python.org的Python 2.7.2。
Tim Swast 2013年

13
@moose我问了一个问题:-)这是答案-> stackoverflow.com/questions/28894172/…–
Mathias

10
我懂了ValueError: '-' is a bad directive in format '%b %-d, %Y'。OSX,Python 2.7。
理查德

8
%#d将在Windows上执行相同操作
dalle

190

format从python2.6开始,随着方法的出现,我们可以做这种事情:

>>> 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'

2
非常好!不幸的是,如果要使用文本表示形式time.strftime('%A %B %d, %Y')(产生(现在在英语语言环境中)),则不能单独使用Tuesday October 07, 2014
PekkaKlärck,2014年

@PekkaKlärck-直到现在我还没有注意到您的评论的某些原因。事实证明,datetime指定了一个非常有趣的__format__钩子,可让您编写类似的内容。
mgilson

2
一个问题是,'{dt.hour}'使用24小时时钟:(使用第二个选项还是带你回到使用。'{%#I}'在Windows和'{%-I}'Unix上。
ubomb

好点子。我从未在代码中使用12小时制时钟表示形式,因此我没有想到这种情况。
mgilson

我建议您查看有关格式功能的此附加文档:pyformat.info
Mark

37

%根据http://docs.python.org/library/time.html的介绍,某些平台可能支持字母之间的宽度和精度规范(例如月份中的“ d”),但这绝对是不可移植的解决方案(例如,在我的Mac上不起作用;-)。也许您可以在之后使用字符串替换(或RE,对于真正讨厌的格式)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日”
用户

6
@User上面的代码检查0之前的空格,如果没有“ 2000年1月1日”,则该空格不存在。
Alagappan Ramu 2013年

@alex,请删除此答案,您可能知道,这与正确答案相距甚远。
CONvid19

29

strftime()GNU C库支持的修饰符的文档。(就像之前说过的那样,它可能不是便携式的。)您可能感兴趣的是:

  • %e而不是%d将月份中的前导零替换为空格

它适用于我的Python(在Linux上)。我不知道它是否对您有用。


3
在Windows w / Python 2.6上,%e对我而言失败。我猜它是特定于* nix的。太糟糕了:(
火箭猴

1
至少在* nix系统上,这是最干净,最通用的解决方案。这适用于
OSX。– BFTM

%-d 上面一样,此方法在带有Python 2.7.2的OS X 10.8.5中有效,但在带有Python 2.7.3的Windows 7 Pro 64位中无效。
Johan

1
这在Windows 7 SP1和Python 3.5.1上对我有用。
尼尔·比林汉姆

1
这引入了一个额外的空间,而不是前导零,因此,如果您要查找完全匹配的内容,可能不是这样。>>>一个= datetime.datetime(2019,5,1,23,28,48,175214)>>> one.strftime('%b%e%H')'May 1 23'>>>十一= datetime .datetime(2019,5,11,23,28,48,175214)>>> eleven.strftime( '%b%E%H') '五一11 23'
hebeha

28
>>> 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,2015年

2
@MarcoBonelli:尝试对字符串“ X12 / X12 / 14”提出建议,您会看到。
gdw2

1
这是黑客,但这是pythonic黑客。
Josh M.



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 2012年

8

看一下-波纹管:

>>> 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

这应该是公认的答案。做什么,超级简单易记。通过文档快速浏览,我找不到此信息。
卢卡斯利马

1
“这应该是公认的答案”。不,它不应该,因为这仅适用于Linux。
user136036


3

因为%d您可以使用转换为整数,int()否则它将自动删除前导0并变为整数。然后,您可以使用将其转换回字符串str()


2
OP的问题是要使用一种在strftime调用中使用格式说明符的解决方案,而不是涉及str()的自行解决方案
Dave Hooper

好答案,不要听戴夫胡珀
Toskan

3

例如,即使在同一OS的不同版本之间使用“%-d”也不是可移植的。更好的解决方案是分别提取日期成分,然后在日期特定的格式运算符和每个成分的日期属性访问之间进行选择。

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

因为Python实际上只是strftime(3)在您的平台上调用C语言函数,所以可能是有些格式字符可用于控制前导零;尝试man strftime看看。但是,当然,结果不会是可移植的,因为Python手册会提醒您。:-)

我会尝试使用一种新样式的datetime对象,该对象具有诸如t.yeart.month和的属性t.day,并通过%运算符的正常高效能格式来设置这些对象,该格式确实支持对前导零的控制。有关详细信息,请参见http://docs.python.org/library/datetime.html。更好的是,"".format()如果您的Python拥有运算符,并且更现代,请使用运算符。它也有许多数字格式选项。请参阅:http : //docs.python.org/library/string.html#string-formatting


2

基于Alex的方法,这将适用于字符串开头和空格后的情况:

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

我喜欢它比.format或%-d好,因为它是跨平台的,可以让我继续使用strftime(获取“ 11月”和“星期一”之类的信息)。


1

老问题了,但是%l(小写L)在strftime中对我有用:但是,这可能不适用于每个人,因为我发现的Python文档中未列出


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

这取代了前导零一个空间,这也不是什么OP询问
戴夫·胡珀

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'使用python 3.5
ji-ruh
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.