Python strftime - date不带前导0?

当使用Python strftime时,是否有一种方法可以删除日期的第一个0,如果它在10号之前,即。所以011?不能找到一个%thingy ?

谢谢!

206974 次浏览

根据http://docs.python.org/library/time.html,一些平台可能支持介于%和字母之间的宽度和精度规格(例如'd'表示月中的一天)——但这绝对是一个不可移植的解决方案(例如,在我的Mac上不能工作;-)。也许你可以在strftime之后使用字符串替换(或RE,对于真正讨厌的格式)来补救这个问题?例如:

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

因为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#string-formatting

在这里是GNU C库中strftime()支持的修饰符的文档。(就像人们之前说的,它可能不方便携带。)你可能感兴趣的是:

  • %e代替%d将用一个空格替换月中的第一天的前导零

它适用于我的Python (Linux)。我不知道它对你是否有效。

我发现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')

实际上我也有同样的问题,我意识到,如果你在%和字母之间添加一个连字符,你可以删除前导零。

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

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

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

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

看看下面的-:

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

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

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

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

与.format或%-d相比,我更喜欢这个,因为它是跨平台的,并且允许我继续使用strftime(以获得“November”和“Monday”之类的东西)。

有点晚了,但%-d在我这边工作。

datetime.now().strftime('%B %-d, %Y')产生类似“2014年11月5日”的东西

欢呼:)

在Windows上,添加一个“#”,如“% % # # m / d / Y % % #我:% m: % S % p '

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

老问题,但是%l(小写l)在strftime中对我有用:不过,这可能不适用于每个人,因为我找到的Python文档中没有列出它

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

简单地像这样使用replace:

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

它将输出:

'2017/7/21'

使用,例如,“%-d”即使在相同操作系统的不同版本之间也不能移植。 更好的解决方案是分别提取日期组件,并在特定于日期的格式化操作符和每个组件的日期属性访问之间进行选择

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

Python 3.6 +:

from datetime import date
today = date.today()
text = "Today it is " + today.strftime(f"%A %B {today.day}, %Y")

我迟到了,但是一个简单的列表切片就可以完成工作

today_date = date.today().strftime('%d %b %Y')
if today_date[0] == '0':
today_date = today_date[1:]

如果我们想只获取date,而前导为0,我们可以

d = date.today()
day = int(d.strftime("%d"))

对于大多数情况,标准库已经足够好了,但对于真正详细的日期操作,您应该始终寻找一些专门的第三方库。

使用箭头:

>>> import arrow
>>> arrow.utcnow().format('dddd, D. M. YYYY')
'Friday, 6. 5. 2022'

查看完整的支持的令牌列表