2012-03-01 17 views
38

Esiste un formato per la stampa di datetime Python che non utilizzeranno lo zero padding in date e ore?Formattazione datetime di Python senza riempimento dello zero

Formato sto usando ora:

mydatetime.strftime('%m/%d/%Y %I:%M%p') 

Risultato: 02/29/2012 17:03
desiderata: 2/29/2012 17:03

Quale formato rappresenterebbe il mese come "2" anziché "02" e ora come "5:03 PM" anziché "05: 03:00"

risposta

35

Le opzioni di formattazione disponibili con datetime.strftime() sarà tutto a zero pad. Si potrebbe naturalmente rotolo voi propria funzione di formattazione, ma la soluzione più semplice in questo caso potrebbe essere quello di post-processo il risultato di datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ") 

(Cioè, se si decide che così facendo è davvero vale la pena Perché non lasciare semplicemente gli zeri?)

+1

Sven- Perché voglio sembrare Facebook. Grazie! – Yarin

+0

Questo è utile. Avevo bisogno di creare URL con giorni non imbottiti e dovevo raggruppare 3 di questi elementi insieme: dt.strftime ("% B _") + dt.strftime ("% d"). Lstrip ("0") + dt.strftim \ e (", _% Y") – philshem

+2

Pochissime persone utilizzano ore a zero ore nel Nord America quando scrivono l'ora a mano. –

64

Il nuovo sistema di formattazione delle stringhe fornisce un'alternativa a strftime. È abbastanza leggibile, anzi, potrebbe essere preferibile a strftime per quell'account. Per non parlare del fatto che non fa nulla-pad:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now()) 
'3/1/2012' 

Dal momento che probabilmente si desidera zero padding nel campo dei minuti, si potrebbe fare questo:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now) 
'3/1/2012 20:00' 

Se si vuole "regolare" al posto del tempo "militare", puoi comunque utilizzare anche gli specificatori standard strftime. Per comodità, per i nostri scopi, strftimefa fornire un codice per il tempo di 12 ore imbottito con uno spazio vuoto al posto di uno zero:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now) 
'4/4/2014 6:00PM' 

Questo diventa un po 'meno leggibile, ahimè. E come sottolinea @mlissner, il strftime fallirà su alcune (tutte?) Piattaforme per date precedenti al 1900.

+1

Cool: quanto è nuovo questo sistema di formattazione? - Non l'ho mai visto – Yarin

+1

È stato in giro da Python 2.6. (Non è _questo_ nuovo.) – senderle

+3

Per compitare il mese, per esempio, puoi usare il seguente: '" {0.giugno} {0:% B% Y} ". Format (d)' che ti darebbe ' "2 agosto 2013" come giorno di questo commento :) – Jens

51

L'altra alternativa per evitare l'aspetto zero "tutto o nessuno" sopra è mettere un segno di fronte al tipo di campo:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p') 

Allora questo: '2015/04/10 03:00'

diventa: '2015/04/10 03:00'

È possibile opzionalmente di inserire un segno meno in fronte del giorno se lo si desidera.

+1

Questa è in realtà la risposta corretta e funziona in altri sistemi (come matplotlib e panda). –

+12

Ottima risposta, ma solo Linux. Non funzionerà su Windows. http://stackoverflow.com/questions/10807164/python-time-formatting-different-in-windows – ExactaBox

2

Buona risposta da Chris Freeman su Linux.

su Windows, è:

mydate.strftime('%#m/%#d/%Y') 

pensiero che potrebbe aiutare.

16

risposta accettata non è una soluzione adeguata (secondo me) il corretto metodi documentati:

In Linux "#" è sostituito da "-":

% -d,% -H,% -I, % -j,% -m,% -M,% -S,% -U,% -w,% -W,% -y,% -Y

In Windows "-" è sostituito da "#" :

% # d,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% #Y

#Linux 
mydatetime.strftime('%-m/%d/%Y %-I:%M%p') 

# Windows 
mydatetime.strftime('%#m/%d/%Y %#I:%M%p') 
Fonte

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

come affermato da Sagneta: Il trucco # hash su Windows è disponibile solo per eseguibile nativo pitone. questo non funzionerà con le implementazioni python basate su cygwin.

+2

Questo è corretto. Si noti tuttavia che il trucco dell'hash # su Windows è disponibile solo per gli eseguibili Python nativi. In altre parole, questo non funzionerà con le implementazioni Python basate su cygwin. – sagneta

+0

Wow, è bello saperlo, ma sono sconvolto dalla conseguenza. Sto testando la formattazione della data restituita da un database e ho bisogno di passare la formattazione prevista per ogni test e questo aggiunge un sacco di complessità. – Keith

Problemi correlati