In Python habe ich den Eindruck, dass datetime.date
im Grunde nur eine Teilmenge von datetime.datetime
ist, mit weniger Features und etwas weniger Overhead. Ich möchte nie datetime.date
aus folgenden Gründen verwenden:
Keine Conversions mehr zwischen den beiden Typen!
datetime.date
Objekte sind aus naheliegenden Gründen immer zeitzonenunabhängig. Dies macht es schwieriger, die Zeitzonenbehandlung für eine gesamte Anwendung zu verallgemeinern, wenn Sie manchmal datetime.date
und manchmal datetime.datetime
Bei mehreren Gelegenheiten habe ich zufällig Probleme beim Vergleichen von datetime.date
-Objekten und datetime.datetime
-Objekten festgestellt. Wenn nur ein Typ verwendet wird, werden Vergleiche vereinfacht.
Formatierungsunterschiede zwischen datetime.date
und datetime.datetime
sollten nur ein Formatierung Problem sein. Wenn Sie die Differenz weiter in die zugrunde liegende Klasse hineintragen, führt dies zu einer unnötigen Komplexität der Sprache.
Wenn ich auf dem richtigen Weg bin, dann wird datetime.date
in zukünftigen Versionen von Python eventuell nicht mehr weiter verwendet, genauso wie unicode
und long
. Die Annahme dieser Konvention bringt mich jetzt der Kurve voraus.
Es scheint mir, dass das einzige überzeugende Argument für die weitere Verwendung von datetime.date
die geringe Menge an zusätzlichem Speicher und Speicher ist, die in datetime.datetime
enthalten ist. Nehmen wir an, dass mir dieser zusätzliche Aufwand nicht wichtig ist. Gibt es weitere zwingende Gründe, diesen Kurs weiter zu verwenden? Ich möchte nicht zu dieser Konvention wechseln und es später bereuen, weil ich etwas Wichtiges verpasst habe.
Sie repräsentieren verschiedene Dinge.
A datetime
ist ein bestimmter Zeitpunkt.
A date
ist ein Intervall in der Zeit. Es ist nicht 00:00:00 an diesem Tag, es ist der ganze Tag .
Deshalb können Sie nicht direkt zwischen ihnen konvertieren. Und deshalb können Sie datetime
nicht als Ersatz für date
verwenden.
(Die Tatsache, dass derselbe timedelta
-Typ für beide verwendet wird, ist wahrscheinlich ein Fehler im Modul, der einige Male diskutiert wurde, aber ich bezweifle, dass er jemals korrigiert wird.)
Dies ist die genaue Beziehung:
%Vor% Wenn Sie date
nicht verwenden möchten, tun Sie es einfach nicht. Es gibt viele Anwendungen, bei denen die "geringe Menge an zusätzlichem Speicher und Speicherplatz" für eine datetime
eine erhebliche Belastung darstellt, insbesondere wenn eine große Anzahl von date
s in einer Datenbank als Pickles (z. B. in ZODB in einer Zope-Installation - und es ist kein Zufall, dass Zope Corp das damalige PythonLabs-Team bezahlt hat, um das datetime
-Modul zu entwerfen und zu implementieren ;-)).
BEARBEITEN - was ein date
"bedeutet"
Ich möchte ein bisschen auf @abamerts "A date
ist ein Intervall rechtzeitig zurücksetzen. Es ist nicht 00:00:00 an diesem Tag, es ist das ganze Tag. " Du kannst sicherlich darüber nachdenken, aber es gab keine solche Absicht . Ich schrieb fast das gesamte ursprüngliche datetime
-Modul (sowohl die Python- als auch die C-Version) und arbeitete mit den primären Moduldesignern zusammen: Guido van Rossum und Jim Fulton.
Guido war sehr scharf auf die Vorstellung von "naiven" Daten und Zeiten, eine alltägliche "common sense" Vorstellung von Daten und Zeiten, die einfach all die langweiligen Feinheiten ignoriert, die Geeks gern besessen haben ;-) (wie historische Zeitzone - und sogar Kalender - Anpassungen und "Schaltsekunden", die niemandem außer Astronomen wirklich nützlich sind. Für ihn ist der beste Weg zu wissen, was ein Datum bedeutete bedeutet, einen 12-Jährigen zu fragen. Und ihre Antwort ist nicht wichtig. Wenn sie denken, date(2014, 1, 9)
bedeutet "den ganzen Tag", in Ordnung. Wenn sie es als Schlaganfall von Mitternacht zu Beginn des Tages betrachten, auch gut. Dito Mitternacht am Ende des Tages, oder Mittag, oder 3 Uhr Mittagsschlaf, oder andere Zeiten an verschiedenen Tagen, oder überhaupt keine Zeit ... diese Unterschiede sind alle in Ihrem Kopf soweit date
ist betroffen. date
ermutigt oder entmutigt keine von ihnen.
Jetzt kann ein Geek einwenden, "aber wenn ich an date(2014, 1, 9)
als Mittag denke und du an date(2014, 1, 10)
als 3pm denkst, gibt das Subtrahieren eine falsche Antwort zurück!". Gähnen. Fragen Sie einen 12-Jährigen: Es ist offensichtlich, dass für naive Daten der Unterschied genau 1 (naiven) Tag ist.
Es gibt hier nichts, was darauf hindeutet, dass eine bestimmte Person oder Anwendung das nützlich finden sollte. Viele Anwendungen tun finden es nützlich. Wenn deins keiner ist, benutze es nicht.
Alles in allem ist das einzige große Bedauern, das ich über datetime
habe, dass tzinfo
Objekte keine zuverlässige Möglichkeit haben, zwischen "Standard" - und "Tageslicht" -Zeiten während der mehrdeutigen Übergangszeiten zu unterscheiden. Guidos Gefühl der Genügsamkeit wurde (zu meiner Meinung nach) dadurch verletzt, dass ein C struct tm
eine ganze int
( tm_isdst
) für dieses 1 Bit Information verschwendet, das nur benötigt wird, um die Übergangszeiten zu klären. Es ist kein Zufall, dass die meisten geographischen Gebiete, die zwischen "Tageslicht" und "Standard" wechseln, diese Übergänge machen, wenn die meisten Menschen schlafen. Daher sind die Mehrdeutigkeiten für fast alle praktischen Zwecke unsichtbar ("Was meinst du mit 2:10 Uhr?") dass das erste Mal die Uhr 2:10 Uhr gelesen hat, oder das zweite Mal, nachdem wir die Uhr wieder eine Stunde von 3 Uhr morgens bis 2 Uhr nachts eingestellt haben? "). Aber für die wenigen, die sich wirklich darum kümmern, bleibt ein Leben ohne dieses Gebiss ein königlicher Schmerz: (