2012-03-01 28 views
38

¿Hay un formato para imprimir las fechas de Python que no utilizará relleno cero en las fechas y horas?Formato de fecha y hora de Python sin relleno cero

Formato estoy usando ahora:

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

Resultado: 02/29/2012 17:03
deseado: 2/29/2012 17:03

¿Qué formato representaría el mes como '2' en lugar de '02', y el tiempo como '5:03 PM' en lugar de '05: 03PM '

Respuesta

35

Las opciones de formato disponibles con datetime.strftime() será todo cero pad. Se podría, por rollo supuesto propia función de formato, pero la solución más fácil en este caso podría ser la de post-procesar el resultado de datetime.strftime():

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

(Es decir, si se decide que hacerlo es realmente vale la pena ¿Por qué no dejar simplemente los ceros?)

+1

Sven- Porque quiero parecerme a Facebook. ¡Gracias! – Yarin

+0

Esto es útil. Necesitaba crear URLs con días no acolchados, y tuve que encadenar 3 de ellas juntas: dt.strftime ("% B _") + dt.strftime ("% d"). Lstrip ("0") + dt.strftim \ e (", _% Y") – philshem

+2

Muy pocas personas usan horas acolchadas cero en América del Norte cuando escriben la hora a mano. –

64

El nuevo sistema de formato de cadenas ofrece una alternativa al strftime. Es bastante legible; de ​​hecho, podría ser preferible a strftime en esa cuenta. Por no mencionar el hecho de que no hace cero-pad:

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

Dado que es probable que desee relleno con ceros en el campo de minutos, usted puede hacer esto:

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

Si desea "regular" En vez de tiempo "militar", también puede usar los especificadores estándar strftime. Convenientemente, para nuestros propósitos, strftimehace proporcionan un código para el tiempo de 12 horas rellenado con un espacio en blanco en lugar de un cero inicial:

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

Esto se convierte en algo menos legible, por desgracia. Y como señala @mlissner, strftime fallará en algunas (¿todas?) Plataformas para fechas anteriores a 1900.

+1

Cool-¿Qué tan nuevo es este sistema de formateo? - Nunca lo he visto – Yarin

+1

Ha existido desde Python 2.6. (No es así de nuevo.) – senderle

+3

Para deletrear el mes, por ejemplo, puede usar lo siguiente: '" {0.day} {0:% B% Y} ". Format (d)' que le daría ' '2 de agosto de 2013' como el día de este comentario :) – Jens

51

La otra alternativa para evitar el "cero" anterior o "cero" es colocar un signo menos delante del tipo de campo:

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

Entonces esto: '04/10/2015 03 a.m.'

se convierte en: '04.10.2015 03 a.m.'

puede colocar opcionalmente un signo menos en frente del día si lo desea.

+1

Esta es realmente la respuesta correcta, y funciona en otros sistemas (como matplotlib y pandas). –

+12

Excelente respuesta, pero solo para Linux. No funcionará en Windows. http://stackoverflow.com/questions/10807164/python-time-formatting-different-in-windows – ExactaBox

2

Buena respuesta de Chris Freeman en Linux.

En las ventanas, es:

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

pensamiento que podría ayudar.

16

respuesta aceptada no es una solución adecuada (con) el correcto métodos documentados:

En Linux "#" se sustituye por "-":

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

En Windows "-" se reemplaza por "#" :

% # 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') 

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

según lo declarado por Sagneta: El truco de hash # en Windows sólo está disponible para ejecutables Python nativo. esto no funcionará para las implementaciones de python basadas en cygwin.

+2

Esto es correcto. Sin embargo, tenga en cuenta que el truco # hash en Windows solo está disponible para los ejecutables nativos de python. En otras palabras, esto no funcionará para las implementaciones de Python basadas en cygwin. – sagneta

+0

Wow, es genial saberlo, pero estoy horrorizado por la consecuencia. Estoy probando el formato de fecha devuelto desde una base de datos y necesito pasar el formato esperado para cada prueba y esto agrega toneladas de complejidad. – Keith

Cuestiones relacionadas