Formato de fecha y hora de Python sin relleno de ceros

90

¿Existe un formato para imprimir las fechas y horas de Python que no utilice relleno de ceros en fechas y horas?

Formato que estoy usando ahora:

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

Resultado: 29/02/2012 05:03 PM
Deseado : 29/02/2012 5:03 PM

¿Qué formato representaría el mes como '2' en lugar de '02' y la hora como '5:03 p.m.' en lugar de '05: 03 p.m. '?

Yarin
fuente

Respuestas:

77

Las opciones de formato disponibles con datetime.strftime()serán todas cero. Por supuesto, podría lanzar su propia función de formato, pero la solución más fácil en este caso podría ser postprocesar el resultado de datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
Sven Marnach
fuente
1
Sven- Porque quiero parecerme a Facebook. ¡Gracias!
Yarin
4
Muy pocas personas usan horas con relleno de ceros en Norteamérica cuando escriben la hora a mano.
Eric Walker
2
¿No seguirá siendo este cero el día del mes?
Juez Maygarden
1
@JudgeMaygarden: Es por eso que la solución .lstrip("0")elimina el cero a la izquierda .
Sven Marnach
1
¿Por qué quiero eliminar los ceros del pad? Porque esto es incorrecto por RFC 2822 , por ejemplo, en la transmisión de podcasts.
Vitaly Zdanevich
165

La otra alternativa para evitar el aspecto de cero a la izquierda "todo o nada" es colocar un signo menos delante del tipo de campo:

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

Entonces esto: '4/10/2015 03:00 AM'

Se convierte en: '4/10/2015 3:00 AM'

Opcionalmente, puede colocar un signo menos al frente del día si lo desea.

Editar: La característica menos deriva de la biblioteca GNU C ("glibc") como se menciona en la página de manual de Linux strftime en "Notas de Glibc"

ChrisFreeman
fuente
48
Gran respuesta, pero solo Linux. No funcionará en Windows. stackoverflow.com/questions/10807164/…
ExactaBox
1
¿Por qué funciona esto? No puedo encontrar una referencia a esto en los documentos para date.__format__o time.strftime, docs.python.org/3/library/… y docs.python.org/3.8/library/time.html#time.strftime respectivamente
Amin Shah Gilani
1
Publicación de @AminShahGilani actualizada con referencia src
ChrisFreeman
93

El nuevo sistema de formato de cadenas ofrece una alternativa a strftime. Es bastante legible; de ​​hecho, podría ser preferible strftimepor ese motivo. Sin mencionar el hecho de que no hace pad cero:

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

Dado que probablemente desee un relleno de cero en el campo de los minutos, puede hacer esto:

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

Si desea un tiempo "regular" en lugar de un tiempo "militar", también puede utilizar los strftimeespecificadores estándar . Convenientemente, para nuestros propósitos, strftime hace proporcionar un código para el acolchado de 12 horas con un espacio en blanco en lugar de un cero a la izquierda:

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

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

remitente
fuente
1
Ha existido desde Python 2.6. (No es que la nueva.)
senderle
3
Para deletrear el mes, por ejemplo, puede usar lo siguiente: "{0.day} {0:%B %Y}".format(d)que le daría '2 August 2013'como el día de este comentario :)
Jens
2
Esto es interesante, pero en realidad no responde a OP, porque quiere horas AM / PM. En realidad, no voy a rechazarlo, pero la respuesta aceptada es realmente correcta si está tratando de obtener el formato de fecha / hora "estadounidense" en Python.
Dana Cartwright
Tenga en cuenta que esta técnica utiliza strftime, que fallará en fechas anteriores a 1900. Si tiene fechas antiguas, lo lamentará.
mlissner
1
fak! Me acabo de dar cuenta de que no apunté a otro objeto, simplemente lo pasé como un argumento posicional.
JacobIRR
50

La respuesta aceptada no es una solución adecuada (en mi humilde opinión) Los métodos documentados adecuados:

En Linux, "#" se reemplaza 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

Como dijo Sagneta: El truco # hash en Windows solo está disponible para el ejecutable nativo de Python. esto no funcionará para implementaciones de python basadas en cygwin.


fuente
3
Esto es correcto. Sin embargo, tenga en cuenta que el truco # hash en Windows solo está disponible para ejecutables nativos de Python. En otras palabras, esto no funcionará para implementaciones de python basadas en cygwin.
sagneta
2
Es genial saberlo, pero estoy horrorizado por las consecuencias. Estoy probando el formato de fecha devuelto desde una base de datos y necesito aprobar el formato esperado para cada prueba y esto agrega toneladas de complejidad.
Keith
10

Buena respuesta de Chris Freeman en Linux.

En Windows, es:

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

Pensé que eso podría ayudar.

user3685285
fuente
0

"% l" (que es una L minúscula) funciona para la hora (en lugar de "% I"). Solo sé esto por otra respuesta aquí.

Python strftime - ¿fecha sin 0 a la izquierda?

pero desafortunadamente no tienen el código para los otros elementos de una fecha / hora.

Rob Cranfill
fuente