Respuestas:
En realidad, tuve el mismo problema y me di cuenta de que, si agrega un guión entre %
la letra y la letra, puede eliminar el cero inicial.
Por ejemplo %Y/%-m/%-d
.
Esto solo funciona en Unix (Linux, OS X), no en Windows (incluido Cygwin). En Windows, usaría #
, por ejemplo %Y/%#m/%#d
.
ValueError: '-' is a bad directive in format '%b %-d, %Y'
. OSX, Python 2.7.
%#d
haría lo mismo en Windows
Podemos hacer este tipo de cosas con el advenimiento del format
método desde python2.6:
>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'
Aunque quizás esté más allá del alcance de la pregunta original, para formatos más interesantes, puede hacer cosas como:
>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'
Y a partir de python3.6, esto se puede expresar como una cadena formateada en línea :
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')
, lo que produce (ahora, en inglés) Tuesday October 07, 2014
.
__format__
gancho muy interesante que te permite escribir cosas así.
'{dt.hour}'
usa un reloj de 24 horas :(. El uso de la segunda opción todavía lo lleva de nuevo a usar '{%#I}'
en Windows y '{%-I}'
en Unix.
Algunas plataformas pueden admitir especificaciones de ancho y precisión entre %
y la letra (como 'd' para el día del mes), de acuerdo con http://docs.python.org/library/time.html , pero definitivamente no es portátil solución (por ejemplo, no funciona en mi Mac ;-). ¿Tal vez pueda usar un reemplazo de cadena (o RE, para un formato realmente desagradable) después de la strftime
solución? p.ej:
>>> 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'
Aquí está la documentación de los modificadores compatibles con strftime()
la biblioteca GNU C. (Como la gente dijo antes, puede que no sea portátil). De interés para usted podría ser:
%e
en lugar de %d
reemplazará el cero inicial en el día del mes con un espacioFunciona en mi Python (en Linux). No sé si funcionará en el tuyo.
>>> 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','')
? Solo hazlo .replace('X0', '')
y será bueno.
En Windows, agregue un '#', como en '% # m /% # d /% Y% # I:% M:% S% p'
Para referencia: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
bastante tarde para la fiesta pero %-d
funciona de mi parte.
datetime.now().strftime('%B %-d, %Y')
produce algo así como "5 de noviembre de 2014"
salud :)
ValueError: Invalid format string
en mi sistema de Windows
Encuentro que el filtro de formato de fecha de plantilla de Django es rápido y fácil. Elimina los ceros a la izquierda. Si no te importa importar el módulo Django, échale un vistazo.
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()
Echa un vistazo a -
continuación:
>>> 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)
simplemente use replace
así:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
saldrá:
'2017/7/21'
Para %d
que pueda convertir a entero usando int()
, eliminará automáticamente el 0 inicial y se convertirá en entero. Luego puede volver a convertir a cadena usando str()
.
utilizando, por ejemplo, "% -d" no es portátil, incluso entre diferentes versiones del mismo sistema operativo. Una mejor solución sería extraer los componentes de fecha individualmente y elegir entre operadores de formato específicos de fecha y acceso a atributos de fecha para cada componente.
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Debido a que Python realmente solo llama a la strftime(3)
función del lenguaje C en su plataforma, puede ser que haya caracteres de formato que podría usar para controlar el cero inicial; tratarman strftime
echar un vistazo. Pero, por supuesto, el resultado no será portátil, como le recordará el manual de Python. :-)
Intentaría usar un datetime
objeto de estilo nuevo en su lugar, que tiene atributos como t.year
y t.month
y t.day
, y los sometería al formato normal y de alta potencia del %
operador, que admite el control de los ceros a la izquierda. Consulte http://docs.python.org/library/datetime.html para más detalles. Mejor aún, use el "".format()
operador si su Python lo tiene y sea aún más moderno; También tiene muchas opciones de formato para números. Ver: http://docs.python.org/library/string.html#string-formatting .
Basado en el método de Alex, esto funcionará tanto para los casos de inicio de cadena como después de espacios:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
Me gusta más que .format o% -d porque es multiplataforma y me permite seguir usando strftime (para obtener cosas como "noviembre" y "lunes").
Pregunta anterior, pero% l (L minúscula) funcionó para mí en el tiempo de ejecución: sin embargo, esto puede no funcionar para todos, ya que no aparece en la documentación de Python que encontré
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