Kann ich einfach aufhören, datetime.date vollständig zu verwenden?

7

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

  • verwenden
  • 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.

    
galarant 10.01.2014, 00:42
quelle

2 Antworten

12

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.)

    
abarnert 10.01.2014, 00:52
quelle
9

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: (

    
Tim Peters 10.01.2014 01:39
quelle

Tags und Links