Dieser Code gibt einmal pro Jahr in der Nacht der Uhrverschiebung (mitteleuropäische Sommerzeit bis mitteleuropäische Zeit) eine falsche Warnung aus:
import os
import datetime
now = datetime.datetime.now()
age = now - datetime.datetime.fromtimestamp(os.path.getmtime(file_name))
if (age.seconds + age.days * 24 * 3600) < -180:
print('WARN: file has timestap from future?: %s' % age)
Wie kann dieser Code auch während dieser jährlichen einstündigen Schicht funktionieren?
Aktualisieren
Ich kümmere mich nur um das Alter, nicht um die Uhrzeit.
Ihre beiden datetime-Objekte sind 'naiv', was bedeutet, dass sie nichts über die Sommerzeit wissen.
datetime.now()
Gibt die aktuelle Zeit zurück, auf der Ihr Computer ausgeführt wird. Dazu gehört möglicherweise die Sommerzeit. Gleiches gilt fürdatetime.fromtimestamp(os.path.getmtime())
.# 1 - Das Lokalisieren Ihrer datetime-Objekte könnte eine Option sein. etwas wie
# 2 - eine weitere Option mit UTC-Konvertierung mit
datetime
:# 3 - gibt, wie VPfB in seiner Antwort hervorhebt ,
os.path.getmtime
einen UTC-Zeitstempel zurück ( siehe OS- Modul-Dokumente und Zeitmodul- Dokumente ). Die einfachste Lösung könnte daher darin bestehen, die Konvertierung zunächst zu überspringendatetime
und nur UTC-Zeitstempel zu verwenden. zB den aktuellen UTC-Zeitstempel abrufen alstime.time()
.Das Arbeiten mit Zeitzonen kann Sie verrückt machen ... aber es gibt einige gute Ressourcen, z . B. diesen mittleren Beitrag .
quelle
Ihr Problem ist, dass Sie Ihre Zeit bekommen, ohne dass Sie sich der Zeitzone bewusst sind. Wenn sich also die Uhren ändern, beenden Sie den Vergleich eines Zeitstempels vor dem Uhrenwechsel mit einem anderen nach dem Uhrenwechsel, und Ihr Code sieht dies nicht.
Sie sollten stattdessen festlegen, dass Ihre datetime-Objekte auf einer bestimmten Zeitzone basieren, damit Sie keine Probleme mit dem Ändern der Uhr haben. Ich empfehle, das pytz-Modul zu verwenden, um Ihnen dabei zu helfen. In dieser Antwort sehen Sie eine Liste der verfügbaren Zeitzonen: Gibt es eine Liste der Pytz-Zeitzonen?
Hier ist ein einfaches Codebeispiel, wie Sie dies mit zeitzonensensitiven Objekten tun können:
quelle
age = time.time() - os.path.getmtime(file_name)
. Ich interessiere mich nur für das Alter (Zeitdelta), nicht für das Datum / die Uhrzeit.