O porquê: datas são objetos
No Python, datas são objetos. Portanto, quando você os manipula, você manipula objetos, não seqüências de caracteres, nem timestamps nem nada.
Qualquer objeto no Python tem DUAS representações de string:
A representação regular usada por "print" pode ser obtida usando a str()
função Na maioria das vezes, é o formato legível humano mais comum e é usado para facilitar a exibição. Então str(datetime.datetime(2008, 11, 22, 19, 53, 42))
te dá '2008-11-22 19:53:42'
.
A representação alternativa usada para representar a natureza do objeto (como dados). Pode ser usado com a repr()
função e é útil saber que tipo de dados você está manipulando enquanto estiver desenvolvendo ou depurando. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
te dá 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
O que aconteceu foi que, quando você imprimiu a data usando "print", ela foi usada str()
para que você pudesse ver uma boa sequência de datas. Mas quando você imprimiu mylist
, você imprimiu uma lista de objetos e o Python tentou representar o conjunto de dados usando repr()
.
O Como: o que você quer fazer com isso?
Bem, quando você manipula datas, continue usando os objetos date o tempo todo. Eles têm milhares de métodos úteis e a maior parte da API Python espera que as datas sejam objetos.
Quando você quiser exibi-los, basta usar str()
. No Python, a boa prática é converter tudo explicitamente. Portanto, na hora de imprimir, obtenha uma representação de string da sua data usando str(date)
.
Uma última coisa. Quando você tentou imprimir as datas, você imprimiu mylist
. Se você deseja imprimir uma data, imprima os objetos de data, não o contêiner (a lista).
Por exemplo, você deseja imprimir toda a data em uma lista:
for date in mylist :
print str(date)
Observe que , nesse caso específico , você pode até omitir, str()
porque a impressão o utilizará para você. Mas não deve se tornar um hábito :-)
Caso prático, usando seu 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
Formatação avançada de data
As datas têm uma representação padrão, mas você pode imprimi-las em um formato específico. Nesse caso, você pode obter uma representação de string personalizada usando o strftime()
método
strftime()
espera um padrão de sequência explicando como você deseja formatar sua data.
POR EXEMPLO :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Toda a letra após a "%"
representa um formato para algo:
%d
é o número do dia
%m
é o número do mês
%b
é a abreviação do mês
%y
é o ano nos últimos dois dígitos
%Y
é o ano todo
etc
Dê uma olhada na documentação oficial , ou na referência rápida de McCutchen, você não pode conhecer todas elas.
Desde o PEP3101 , cada objeto pode ter seu próprio formato usado automaticamente pelo formato do método de qualquer sequência. No caso da data e hora, o formato é o mesmo usado no strftime. Então você pode fazer o mesmo que acima, desta forma:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
A vantagem deste formulário é que você também pode converter outros objetos ao mesmo tempo.
Com a introdução de literais de cadeia de caracteres formatada (desde Python 3.6, 23/12/2016), isso pode ser escrito como
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Localização
As datas podem se adaptar automaticamente ao idioma e cultura locais se você as usar da maneira certa, mas é um pouco complicado. Talvez para outra pergunta sobre SO (Stack Overflow) ;-)
str()
(a cada elemento da lista), porque foi exatamente isso queprint
implicitamente fez com seutoday
objeto solo .