POURQUOI: les dates sont des objets
En Python, les dates sont des objets. Par conséquent, lorsque vous les manipulez, vous manipulez des objets, pas des chaînes, ni des horodatages ni rien.
Tout objet en Python a DEUX représentations de chaîne:
La représentation régulière utilisée par "print" peut être obtenue en utilisant la str()
fonction. C'est la plupart du temps le format lisible par l'homme le plus courant et est utilisé pour faciliter l'affichage. str(datetime.datetime(2008, 11, 22, 19, 53, 42))
Vous donne donc '2008-11-22 19:53:42'
.
Représentation alternative utilisée pour représenter la nature de l'objet (sous forme de données). Il peut être utile d'utiliser la repr()
fonction et est pratique pour savoir quel type de données vous manipulez pendant que vous développez ou déboguez. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
vous donne 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
Ce qui s'est passé, c'est que lorsque vous avez imprimé la date en utilisant "print", il a utilisé str()
pour que vous puissiez voir une belle chaîne de date. Mais lorsque vous avez imprimé mylist
, vous avez imprimé une liste d'objets et Python a essayé de représenter l'ensemble de données à l'aide de repr()
.
Le Comment: que voulez-vous en faire?
Eh bien, lorsque vous manipulez des dates, continuez à utiliser les objets de date tout au long du processus. Ils ont obtenu des milliers de méthodes utiles et la plupart des API Python s'attendent à ce que les dates soient des objets.
Lorsque vous souhaitez les afficher, utilisez simplement str()
. En Python, la bonne pratique consiste à tout convertir explicitement. Donc, juste au moment d'imprimer, obtenez une représentation sous forme de chaîne de votre date en utilisant str(date)
.
Une dernière chose. Lorsque vous avez essayé d'imprimer les dates, vous avez imprimé mylist
. Si vous souhaitez imprimer une date, vous devez imprimer les objets de date, pas leur conteneur (la liste).
EG, vous voulez imprimer toute la date dans une liste:
for date in mylist :
print str(date)
Notez que dans ce cas spécifique , vous pouvez même l'omettre str()
car print l'utilisera pour vous. Mais cela ne devrait pas devenir une habitude :-)
Cas pratique, en utilisant votre code
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
Formatage de date avancé
Les dates ont une représentation par défaut, mais vous souhaiterez peut-être les imprimer dans un format spécifique. Dans ce cas, vous pouvez obtenir une représentation de chaîne personnalisée à l'aide de la strftime()
méthode.
strftime()
attend un modèle de chaîne expliquant comment vous souhaitez formater votre date.
PAR EXEMPLE :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Toutes les lettres après un "%"
représentent un format pour quelque chose:
%d
est le numéro du jour
%m
est le numéro du mois
%b
est l'abréviation du mois
%y
est l'année des deux derniers chiffres
%Y
est toute l'année
etc
Jetez un œil à la documentation officielle ou à la référence rapide de McCutchen, vous ne pouvez pas tous les connaître.
Depuis PEP3101 , chaque objet peut avoir son propre format utilisé automatiquement par le format de méthode de n'importe quelle chaîne. Dans le cas du datetime, le format est le même que celui utilisé dans strftime. Vous pouvez donc faire la même chose que ci-dessus comme ceci:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
L'avantage de ce formulaire est que vous pouvez également convertir d'autres objets en même temps.
Avec l'introduction des littéraux de chaîne formatés (depuis Python 3.6, 2016-12-23), cela peut être écrit comme
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Localisation
Les dates peuvent s'adapter automatiquement à la langue et à la culture locales si vous les utilisez correctement, mais c'est un peu compliqué. Peut-être pour une autre question sur SO (Stack Overflow) ;-)
str()
(à chaque élément de la liste), car c'est exactement ce qui aprint
implicitement fait pour votretoday
objet solo .