关于padding:Python strftime – 没有前导0的日期?

Python strftime - date without leading 0?

当使用python strftime时,如果日期的前0在10之前,有没有办法删除它,即011呢?找不到一个%的东西?

谢谢!


实际上,我也遇到了同样的问题,我意识到,如果在%和字母之间添加一个连字符,就可以去掉前导零。

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

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


从python2.6开始,随着format方法的出现,我们可以做到这一点:

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

尽管可能超出了原始问题的范围,但对于更有趣的格式,您可以执行以下操作:

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

从python3.6开始,可以用内联格式化字符串表示:

1
2
3
4
5
6
7
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'


根据http://docs.python.org/library/time.html的说法,有些平台可能支持%和字母之间的宽度和精度规范(例如"d"表示每月的某一天),但这绝对是一个不可移植的解决方案(例如,在我的Mac上不起作用)。也许您可以在strftime之后使用字符串替换(或re,用于非常糟糕的格式)来解决这个问题?例如。:

1
2
3
4
5
6
>>> 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'


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


以下是GNUC库中strftime()支持的修改器的文档。(正如人们之前所说,它可能不便于携带。)您可能感兴趣的是:

  • %e代替%d将用一个空格代替月份的前导零

它在我的python(Linux)上工作。我不知道它是否适合你。


在Windows上,添加一个"",如"%m%d%y%i:%m:%s%p"

参考:https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx


参加聚会已经很晚了,但江户十一〔二十二〕在我这边工作。

datetime.now().strftime('%B %-d, %Y')生产类似"2014年11月5日"的产品。

干杯:)


我发现django模板日期格式过滤器既快捷又简单。它去掉前导零。如果您不介意导入django模块,请检查它。

http://docs.djangoproject.com/en/dev/ref/templates/builtins/日期

1
2
from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')


请看下面的-

1
2
3
4
5
6
7
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)


只需这样使用replace

埃多克斯1〔25〕

它将输出:

1
'2017/7/21'

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


根据Alex的方法,这对字符串开头和空格后的情况都有效:

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

我喜欢这个比.format或-d更好,因为这是跨平台的,允许我继续使用strftime(获得像"十一月"和"星期一")。


旧问题,但strftime中的%l(小写L)对我有效:但这可能不适用于所有人,因为我发现的python文档中没有列出它。


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


因为python实际上只是在您的平台上调用C语言strftime(3)函数,所以可能有一些格式字符可以用来控制前导零;请尝试man strftime并查看一下。但是,当然,结果是不可移植的,正如Python手册将提醒您的那样。-)

我会尝试使用一个新的风格的datetime对象,它具有t.yeart.montht.day等属性,并通过%操作符的正常、高性能的格式化,它支持前导零的控制。有关详细信息,请参阅http://docs.python.org/library/datetime.html。更好的是,如果您的python有"".format()操作符并且更加现代,那么就使用它;它也有许多数字格式选项。请参见:http://docs.python.org/library/string.html字符串格式。


%d支持Python3.6.5中的两种(前导零和无前导零)功能(希望在后续版本中也支持)。

enter image description here


例如,即使在同一操作系统的不同版本之间使用"%-d"也不可移植。更好的解决方案是单独提取日期组件,并在每个组件的日期特定格式运算符和日期属性访问之间进行选择。

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