Wir starten mit folgendem Code-Snippet:

>>> import datetime as dt

>>> later_date = dt.datetime.now().replace(hour=18, minute=39, second=59, microsecond=0)
>>> earlier_date = later_date - dt.timedelta(days=1, hours=5, minutes=7, seconds=20)

>>> later_date
datetime.datetime(2025, 8, 31, 18, 39, 59)
>>> earlier_date
# TODO: Replace date with the publish date minus 1 day
datetime.datetime(2025, 8, 30, 13, 32, 39)

Die offensichtliche Richtung

Ich möchte die Differenz der beiden Zeiten haben, also das Delta dazwischen. Das größere minus das kleinere Datum ergibt genau das was ich erwarte:

>>> later_date - earlier_date
datetime.timedelta(days=1, seconds=18440)

Eigentlich hätte ich einen Tag, $5$ Stunden, $7$ Minuten und $20$ Sekunden erwartet. Aber da $18440$ Sekunden genau $5$ Stunden, $7$ Minuten und $20$ Sekunden ergeben, ist das in Ordnung und korrekt - so wie ich es erwartet habe.

Die nicht-offensichtliche Richtung

Was passiert wenn wir die Differenz umdrehen? Intuitiv hätte ich dann timedelta(days=-1, seconds=-18440) erwartet. Aber…

>>> earlier_date - later_date
datetime.timedelta(days=-2, seconds=67960)

Was passiert?

Nach einigem Nachdenken macht das tatsächlich Sinn: $67960 + 18440 = 86400$, und ein Tag hat gerade $86400$ Sekunden. Wir können das Delta also verstehen als: Zuerst zwei Tage abziehen, und dann $67960$ Sekunden wieder zum Resultat dazuaddieren. Was dann eben das gleiche ist wie zuerst einen Tag abzuziehen und dann noch $18440$ Sekunden abzuziehen.

Gefahr!

Und das könnte potentiell gefährlich werden:

(earlier_date - later_date).seconds
67960

Bedeutet: Auch wenn ich ein negatives Timedelta habe, können die Sekunden positiv sein! Das muss mir als Entwickler bewusst sein.

Und die finale Lösung

Tatsächlich genügt es aber, die total_seconds() anzuschauen:

(earlier_date - later_date).total.seconds()
-104840.0

Damit klappt alles wieder so wie ich es mir vorstelle. Hier ist nur zu beachten, dass die total_seconds() keine Ganzzahl sein müssen - was Sinn macht, da ich ja eine höhere Präzision haben könnte, und total_seconds() trotzdem das richtige ergeben sollte.