PERCHÉ: le date sono oggetti
In Python, le date sono oggetti. Pertanto, quando li manipoli, manipoli oggetti, non stringhe, né timestamp né altro.
Qualsiasi oggetto in Python ha DUE rappresentazioni di stringhe:
La rappresentazione regolare utilizzata da "stampa" può essere ottenuta utilizzando la str()
funzione. È il più delle volte il più comune formato leggibile dall'uomo e viene utilizzato per facilitare la visualizzazione. Quindi str(datetime.datetime(2008, 11, 22, 19, 53, 42))
ti dà '2008-11-22 19:53:42'
.
La rappresentazione alternativa utilizzata per rappresentare la natura dell'oggetto (come dati). Può essere utile utilizzare la repr()
funzione ed è utile sapere quale tipo di dati manipoli mentre sviluppi o esegui il debug. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
ti dà 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
Quello che è successo è che quando hai stampato la data usando "print", è stata usata str()
per vedere una bella stringa di date. Ma quando hai stampato mylist
, hai stampato un elenco di oggetti e Python ha provato a rappresentare l'insieme di dati, usando repr()
.
The How: cosa vuoi fare con quello?
Bene, quando manipoli le date, continua a usare gli oggetti data per tutto il tempo. Hanno ottenuto migliaia di metodi utili e la maggior parte dell'API Python prevede che le date siano oggetti.
Quando vuoi visualizzarli, basta usare str()
. In Python, la buona pratica è lanciare esplicitamente tutto. Quindi proprio quando è il momento di stampare, ottieni una rappresentazione in formato stringa della tua data usando str(date)
.
Un'ultima cosa. Quando hai provato a stampare le date, hai stampato mylist
. Se si desidera stampare una data, è necessario stampare gli oggetti data, non il loro contenitore (l'elenco).
Ad esempio, vuoi stampare tutta la data in un elenco:
for date in mylist :
print str(date)
Nota che in quel caso specifico , puoi persino omettere str()
perché print lo userà per te. Ma non dovrebbe diventare un'abitudine :-)
Caso pratico, usando il tuo codice
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
Formattazione data avanzata
Le date hanno una rappresentazione predefinita, ma potresti volerle stampare in un formato specifico. In tal caso, è possibile ottenere una rappresentazione di stringa personalizzata utilizzando il strftime()
metodo
strftime()
si aspetta uno schema a corde che spieghi come si desidera formattare la data.
PER ESEMPIO :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Tutta la lettera dopo un "%"
rappresenta un formato per qualcosa:
%d
è il numero del giorno
%m
è il numero del mese
%b
è l'abbreviazione del mese
%y
sono le ultime due cifre dell'anno
%Y
è tutto l'anno
eccetera
Dai un'occhiata alla documentazione ufficiale o al riferimento rapido di McCutchen che non puoi conoscere tutti.
A partire da PEP3101 , ogni oggetto può avere il proprio formato utilizzato automaticamente dal formato del metodo di qualsiasi stringa. Nel caso del datetime, il formato è lo stesso usato in strftime. Quindi puoi fare come sopra in questo modo:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
Il vantaggio di questo modulo è che puoi anche convertire altri oggetti contemporaneamente.
Con l'introduzione dei letterali di stringhe formattate (da Python 3.6, 23-12-2016), questo può essere scritto come
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Localizzazione
Le date possono adattarsi automaticamente alla lingua e alla cultura locale se le usi nel modo giusto, ma è un po 'complicato. Forse per un'altra domanda su SO (StackTranslate.it) ;-)
str()
(a ciascun elemento dell'elenco), perché è proprio quello che haprint
implicitamente fatto l'today
oggetto solista .