Risposte:
In realtà ho avuto lo stesso problema e mi sono reso conto che, se aggiungi un trattino tra la %
e la lettera, puoi rimuovere lo zero iniziale.
Per esempio %Y/%-m/%-d
.
Funziona solo su Unix (Linux, OS X), non su Windows (incluso Cygwin). Su Windows, useresti #
, ad es %Y/%#m/%#d
.
ValueError: '-' is a bad directive in format '%b %-d, %Y'
. OSX, Python 2.7.
%#d
farebbe lo stesso su Windows
Possiamo fare questo genere di cose con l'avvento del format
metodo da python2.6:
>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'
Anche se forse oltre la portata della domanda originale, per formati più interessanti, puoi fare cose come:
>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'
E a partire da python3.6, questo può essere espresso come una stringa formattata in linea :
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')
, che produce (ora, su impostazioni locali inglesi) Tuesday October 07, 2014
.
__format__
hook molto interessante che ti permette di scrivere cose del genere.
'{dt.hour}'
utilizza un orologio di 24 ore :(. L'uso della seconda opzione ti riporta ancora all'utilizzo '{%#I}'
su Windows e '{%-I}'
su Unix.
Alcune piattaforme potrebbero supportare specifiche di larghezza e precisione tra %
e la lettera (come 'd' per il giorno del mese), secondo http://docs.python.org/library/time.html - ma è sicuramente un non portatile soluzione (ad es. non funziona sul mio Mac ;-). Forse puoi usare una stringa di sostituzione (o RE, per un formato davvero brutto) dopo il strftime
rimedio? per esempio:
>>> 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'
Ecco la documentazione dei modificatori supportati da strftime()
nella libreria GNU C. (Come la gente ha detto prima, potrebbe non essere portatile.) Di tuo interesse potrebbe essere:
%e
invece di %d
sostituirà lo zero iniziale nel giorno del mese con uno spazioFunziona sul mio Python (su Linux). Non so se funzionerà sul tuo.
>>> 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','')
? Fallo .replace('X0', '')
e andrà bene.
Su Windows, aggiungi un '#', come in '% # m /% # d /% Y% # I:% M:% S% p'
Per riferimento: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
abbastanza tardi per la festa, ma %-d
lavora alla mia fine.
datetime.now().strftime('%B %-d, %Y')
produce qualcosa di simile "5 novembre 2014"
Saluti :)
ValueError: Invalid format string
nel mio sistema Windows.
Trovo che il filtro di formattazione della data del modello Django sia semplice e veloce. Elimina gli zeri iniziali. Se non ti dispiace importare il modulo Django, dai un'occhiata.
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()
Dai un'occhiata a -
muggito:
>>> 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)
usa semplicemente replace
così:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
produrrà:
'2017/7/21'
Perché %d
puoi convertirlo in intero usando int()
quindi rimuoverà automaticamente lo 0 iniziale e diventa intero. È quindi possibile riconvertire in stringa utilizzando str()
.
l'utilizzo, ad esempio, "% -d" non è portatile anche tra versioni diverse dello stesso sistema operativo. Una soluzione migliore sarebbe quella di estrarre i componenti della data singolarmente e scegliere tra operatori di formattazione specifici della data e accesso all'attributo della data per ciascun componente.
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Poiché Python chiama semplicemente la strftime(3)
funzione del linguaggio C sulla tua piattaforma, è possibile che ci siano caratteri di formato che potresti usare per controllare lo zero iniziale; provareman strftime
dare un'occhiata. Ma, naturalmente, il risultato non sarà portatile, come ricorderà il manuale di Python. :-)
Proverei invece a utilizzare un datetime
oggetto di nuovo stile , che ha attributi come t.year
e t.month
e t.day
, e li inserisce attraverso la normale formattazione ad alta potenza %
dell'operatore, che supporta il controllo degli zeri iniziali. Vedi http://docs.python.org/library/datetime.html per i dettagli. Meglio ancora, usa l' "".format()
operatore se il tuo Python lo possiede ed essere ancora più moderno; ha molte opzioni di formato anche per i numeri. Vedi: http://docs.python.org/library/string.html#string-formatting .
Basato sul metodo di Alex, questo funzionerà sia per i casi di inizio stringa che after-space:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
Mi piace di più di .format o% -d perché è multipiattaforma e mi permette di continuare a usare strftime (per ottenere cose come "November" e "Monday").
Vecchia domanda, ma% l (L minuscola) ha funzionato per me in breve tempo: questo potrebbe non funzionare per tutti, tuttavia, poiché non è elencato nella documentazione di Python che ho trovato
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