Das WARUM: Daten sind Objekte
In Python sind Datumsangaben Objekte. Wenn Sie sie manipulieren, manipulieren Sie daher Objekte, keine Zeichenfolgen, keine Zeitstempel oder irgendetwas.
Jedes Objekt in Python hat ZWEI Zeichenfolgendarstellungen:
Die reguläre Darstellung, die von "print" verwendet wird, kann mit der str()
Funktion abgerufen werden . Es ist meistens das am häufigsten lesbare Format und wird verwendet, um die Anzeige zu vereinfachen. So str(datetime.datetime(2008, 11, 22, 19, 53, 42))
gibt es dir '2008-11-22 19:53:42'
.
Die alternative Darstellung, die zur Darstellung der Objektnatur (als Daten) verwendet wird. Es kann mithilfe der repr()
Funktion verwendet werden und ist praktisch, um zu wissen, welche Art von Daten Sie während der Entwicklung oder des Debuggens bearbeiten. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
gibt dir 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
.
Was passiert ist, ist, dass wenn Sie das Datum mit "Drucken" gedruckt haben, es verwendet wurde, str()
damit Sie eine schöne Datumszeichenfolge sehen konnten. Wenn Sie jedoch gedruckt haben mylist
, haben Sie eine Liste von Objekten gedruckt , und Python hat versucht, den Datensatz mithilfe von darzustellen repr()
.
Das Wie: Was willst du damit machen?
Wenn Sie Datumsangaben bearbeiten, verwenden Sie die Datumsobjekte weiterhin. Sie haben Tausende nützlicher Methoden und die meisten Python-APIs erwarten, dass Daten Objekte sind.
Wenn Sie sie anzeigen möchten, verwenden Sie einfach str()
. In Python empfiehlt es sich, alles explizit zu übertragen. Wenn es also Zeit zum Drucken ist, erhalten Sie eine Zeichenfolgendarstellung Ihres Datums mit str(date)
.
Eine letzte Sache. Beim Versuch, die Daten zu drucken, haben Sie gedruckt mylist
. Wenn Sie ein Datum drucken möchten, müssen Sie die Datumsobjekte drucken, nicht ihren Container (die Liste).
ZB möchten Sie das gesamte Datum in einer Liste drucken:
for date in mylist :
print str(date)
Beachten Sie, dass Sie in diesem speziellen Fall sogar weglassen können, str()
da der Druck dies für Sie verwendet. Aber es sollte keine Gewohnheit werden :-)
Praktischer Fall mit Ihrem 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
Erweiterte Datumsformatierung
Daten haben eine Standarddarstellung, aber Sie können sie in einem bestimmten Format drucken. In diesem Fall können Sie mithilfe der strftime()
Methode eine benutzerdefinierte Zeichenfolgendarstellung abrufen.
strftime()
erwartet ein Zeichenfolgenmuster, das erklärt, wie Sie Ihr Datum formatieren möchten.
Z.B :
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
Alle Buchstaben nach a "%"
stellen ein Format für etwas dar:
%d
ist die Tagesnummer
%m
ist die Monatszahl
%b
ist die Monatsabkürzung
%y
ist das Jahr der letzten zwei Ziffern
%Y
ist das ganze Jahr
usw
Werfen Sie einen Blick auf die offizielle Dokumentation oder McCutchens Kurzreferenz, Sie können nicht alle kennen.
Seit PEP3101 kann jedes Objekt ein eigenes Format haben, das automatisch vom Methodenformat einer beliebigen Zeichenfolge verwendet wird. Im Fall von datetime ist das Format dasselbe, das in strftime verwendet wird. So können Sie das Gleiche wie oben tun:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
Der Vorteil dieses Formulars besteht darin, dass Sie gleichzeitig auch andere Objekte konvertieren können.
Mit der Einführung formatierter Zeichenfolgenliterale (seit Python 3.6, 23.12.2016) kann dies wie folgt geschrieben werden
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
Lokalisierung
Daten können sich automatisch an die Landessprache und -kultur anpassen, wenn Sie sie richtig verwenden, aber es ist etwas kompliziert. Vielleicht für eine andere Frage zu SO (Stack Overflow) ;-)
str()
(auf jedes Element der Liste), denn genau das hatprint
implizit mit Ihrem Solo-today
Objekt geschehen.