El POR QUÉ: las fechas son objetos
En Python, las fechas son objetos. Por lo tanto, cuando los manipulas, manipulas objetos, no cadenas, ni marcas de tiempo ni nada.
Cualquier objeto en Python tiene DOS representaciones de cadena:
La representación regular que usa "print" se puede obtener usando la str()
función. Es la mayoría de las veces el formato legible por humanos más común y se utiliza para facilitar la visualización. Entonces str(datetime.datetime(2008, 11, 22, 19, 53, 42))
te da '2008-11-22 19:53:42'
.
La representación alternativa que se utiliza para representar la naturaleza del objeto (como datos). Se puede obtener usando la repr()
función y es útil para saber qué tipo de datos está manipulando mientras está desarrollando o depurando. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
le da 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
Lo que sucedió es que cuando imprimiste la fecha usando "imprimir", se usó str()
para que pudieras ver una bonita cadena de fecha. Pero cuando imprimió mylist
, imprimió una lista de objetos y Python intentó representar el conjunto de datos, utilizando repr()
.
El Cómo: ¿qué quieres hacer con eso?
Bueno, cuando manipulas fechas, sigue usando los objetos de fecha todo el tiempo. Obtuvieron miles de métodos útiles y la mayoría de las API de Python esperan que las fechas sean objetos.
Cuando desee mostrarlos, simplemente utilícelos str()
. En Python, la buena práctica es lanzar explícitamente todo. Entonces, cuando sea hora de imprimir, obtenga una representación de cadena de su fecha usando str(date)
.
Una última cosa. Cuando trataste de imprimir las fechas, imprimiste mylist
. Si desea imprimir una fecha, debe imprimir los objetos de fecha, no su contenedor (la lista).
Por ejemplo, desea imprimir toda la fecha en una lista:
for date in mylist :
print str(date)
Tenga en cuenta que en ese caso específico , incluso puede omitir str()
porque print lo usará para usted. Pero no debería convertirse en un hábito :-)
Caso práctico, usando tu código
import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22
# It's better to always use str() because :
print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22
print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects
print "This is a new day : " + str(mylist[0])
>>> This is a new day : 2008-11-22
Formato de fecha avanzado
Las fechas tienen una representación predeterminada, pero es posible que desee imprimirlas en un formato específico. En ese caso, puede obtener una representación de cadena personalizada utilizando el strftime()
método
strftime()
espera un patrón de cadena que explique cómo desea formatear su fecha.
P.EJ :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Todas las letras después de un "%"
representan un formato para algo:
%d
es el número del día
%m
es el número del mes
%b
es la abreviatura del mes
%y
es el año dos últimos dígitos
%Y
es todo el año
etc.
Eche un vistazo a la documentación oficial , o la referencia rápida de McCutchen, no puede conocerlos todos.
Desde PEP3101 , cada objeto puede tener su propio formato utilizado automáticamente por el formato del método de cualquier cadena. En el caso de datetime, el formato es el mismo utilizado en strftime. Entonces puedes hacer lo mismo de arriba así:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
La ventaja de este formulario es que también puede convertir otros objetos al mismo tiempo.
Con la introducción de los literales de cadena con formato (desde Python 3.6, 2016-12-23) esto se puede escribir
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Localización
Las fechas pueden adaptarse automáticamente al idioma y la cultura local si las usa de la manera correcta, pero es un poco complicado. Tal vez para otra pregunta sobre SO (desbordamiento de pila) ;-)
str()
(a cada elemento de la lista), porque eso es exactamente lo queprint
implícitamente hizo a sutoday
objeto solo .