Respostas:
Na verdade, tive o mesmo problema e percebi que, se você adicionar um hífen entre %
a letra e a letra, poderá remover o zero à esquerda.
Por exemplo %Y/%-m/%-d
.
Isso funciona apenas no Unix (Linux, OS X), não no Windows (incluindo Cygwin). No Windows, você usaria #
, por exemplo %Y/%#m/%#d
.
ValueError: '-' is a bad directive in format '%b %-d, %Y'
. OSX, Python 2.7.
%#d
faria o mesmo no Windows
Podemos fazer esse tipo de coisa com o advento do format
método desde python2.6:
>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'
Embora talvez esteja além do escopo da pergunta original, para formatos mais interessantes, você pode fazer coisas como:
>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'
E a partir do python3.6, isso pode ser expresso como uma string formatada em linha :
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'
time.strftime('%A %B %d, %Y')
, que produz (agora, no idioma inglês) Tuesday October 07, 2014
.
__format__
gancho muito interessante que permite escrever coisas assim.
'{dt.hour}'
usa um relógio de 24 horas :( Usando a segunda opção ainda traz para você voltar a usar. '{%#I}'
No Windows e '{%-I}'
no Unix.
Algumas plataformas podem suportar especificação de largura e precisão entre %
e a letra (como 'd' para o dia do mês), de acordo com http://docs.python.org/library/time.html - mas é definitivamente um dispositivo não portátil solução (por exemplo, não funciona no meu Mac ;-). Talvez você possa usar uma sequência de substituição (ou RE, para um formato realmente desagradável) após a strftime
correção. por exemplo:
>>> 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'
Aqui está a documentação dos modificadores suportados pelostrftime()
biblioteca GNU C. (Como as pessoas disseram antes, pode não ser portátil.) De seu interesse, você pode ser:
%e
ao invés de %d
substituirá o zero inicial no dia do mês por um espaçoFunciona no meu Python (no Linux). Não sei se funcionará no seu.
%-d
acima , isso funciona no OS X 10.8.5 com Python 2.7.2, mas não no Windows 7 Pro de 64 bits com Python 2.7.3.
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
.replace('X0','X').replace('X','')
? Apenas faça .replace('X0', '')
e será bom.
No Windows, adicione um '#', como em '% # m /% # d /% Y% # I:% M:% S% p'
Para referência: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
muito tarde para a festa, mas %-d
funciona do meu lado.
datetime.now().strftime('%B %-d, %Y')
produz algo como "5 de novembro de 2014"
Felicidades :)
ValueError: Invalid format string
no meu sistema Windows.
Acho que o filtro de formatação de data do modelo do Django é rápido e fácil. Ele remove zeros à esquerda. Se você não se importa de importar o módulo Django, confira.
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')
import django.conf
django.conf.settings.configure()
Veja -
abaixo:
>>> 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)
basta usar replace
assim:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
ele produzirá:
'2017/7/21'
Para %d
você converter para inteiro usando int()
, ele removerá automaticamente o 0 inicial e se tornará inteiro. Em seguida, você pode converter novamente em string usando str()
.
usando, por exemplo, "% -d" não é portátil, mesmo entre versões diferentes do mesmo sistema operacional. Uma solução melhor seria extrair os componentes da data individualmente e escolher entre operadores de formatação específicos para a data e acesso ao atributo de data para cada componente.
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Como o Python realmente chama a strftime(3)
função de linguagem C em sua plataforma, pode ser que haja caracteres de formato que você possa usar para controlar o zero inicial; experimentarman strftime
dar uma olhada. Mas, é claro, o resultado não será portátil, como o manual do Python o lembrará. :-)
Em datetime
vez disso, tentaria usar um objeto de novo estilo , que possui atributos como t.year
e t.month
e t.day
, e colocá-los na formatação normal de alta potência do %
operador, que suporta o controle dos zeros à esquerda. Veja http://docs.python.org/library/datetime.html para obter detalhes. Melhor ainda, use o "".format()
operador se o seu Python o possuir e seja ainda mais moderno; também possui muitas opções de formato para números. Veja: http://docs.python.org/library/string.html#string-formatting .
Com base no método de Alex, isso funcionará para os casos de início de sequência e pós-espaços:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
Gosto disso melhor do que .format ou% -d, porque é multiplataforma e me permite continuar usando o strftime (para obter coisas como "novembro" e "segunda-feira").
Pergunta antiga, mas% l (letra minúscula L) funcionou para mim no strftime: embora isso não funcione para todos, pois não está listado na documentação do Python que encontrei
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'
usando python 3.5