Finde wenn 24 Std. vergangen sind datetimes - Python
Habe ich die folgende Methode:
# last_updated is a datetime() object, representing the last time this program ran
def time_diff(last_updated):
day_period = last_updated.replace(day=last_updated.day+1, hour=1,
minute=0, second=0,
microsecond=0)
delta_time = day_period - last_updated
hours = delta_time.seconds // 3600
# make sure a period of 24hrs have passed before shuffling
if hours >= 24:
print "hello"
else:
print "do nothing"
Ich soll herausfinden, wenn 24 Stunden vergangen, seit last_updated
wie kann ich tun, dass in Python
?
- in welchem format ist der Stand?
- Was ist
last_updated
? Ist es die lokale Uhrzeit? Wollen Sie um herauszufinden, ob mehr als 24 Stunden vergangen, oder die aktuelle Uhrzeit auf den nächsten Tag größer ist, z.B., last_updated=Nov 1, 7pm
und die aktuelle Zeit istNov 2, 6:30pm
(es ist mehr als 24 Stunden, aber 6:30 Uhr ist weniger als 7) (in New York). - Ich habe aktualisiert die Frage ... last_updated ist ein datetime (), die mitteilt, Wann das Programm zuletzt aktualisiert wurde. Alles was ich brauche, jetzt wenn 24h vergangen sind, seit last_updated (von jetzt())
- siehe Kommentar zu PadraicCunningham
- Verwandte: Wie kann ich subtrahieren eines Tages von einem python-Datum?
- Was ist die Zeitzone? Kann man
last_updated
im UTC-Format oder als Unix-timestamp? Kann man 3rd party Module? Brauchen Sie die Unterstützung von Windows? Haben Sie Sorge, wenn Ihr code wird falsch sein, zweimal im Jahr durch eine Stunde oder so?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
last_updated
ist eine naive datetime-Objekt, das die Zeit in UTC:Wenn
last_updated
ist die lokale Zeit (naiv (timezone-nicht bewusst) datetime-Objekt):Wenn
last_updated
ist eine mehrdeutige Zeit, z.B. die Zeit während eines Ende-der-Sommerzeit-übergang (einmal im Jahr in vielen Zeitzonen), dann gibt es eine fünfzig-fünfzig chance, dassmktime()
gibt ein Falsches Ergebnis (z.B., aus eine Stunde).time.mktime()
kann auch fehlschlagen, wenn Ctime
Bibliothek nicht mit einem historischen Zeitzone-Datenbank auf einer Plattform und den UTC-offset für die lokale Zeitzone war anders anlast_updated
Zeit im Vergleich zu jetzt. Es kann für mehr als ein Drittel aller Zeitzonen im letzten Jahr. Linux, OS X, den neuesten Windows-Versionen haben die tz-Datenbank (ich weiß nicht, ob die alten Windows-Versionen arbeiten würde, für eine solche vergangene Termine).Achtung: es könnte verlockend sein, schreiben
datetime.now() - last_updated
(ähnlich wie die UTC-Fall), aber es wird garantiert scheitern auf allen Plattformen, wenn die UTC-offset wurde beilast_updated
Zeit (es ist möglich, in vielen Zeitzonen).mktime()
-basierte Lösung nutzen können, die tz-Datenbank zumindest auf einigen Plattformen und kann daher behandeln die Veränderungen in den UTC-offset für was auch immer Grund.Portabilität, können Sie installieren Sie die tz-Datenbank. Es wird durch
pytz
- Modul in Python.tzlocal
zurückkehren könnenpytz
Zeitzone entsprechend der lokalen Zeitzone:Es funktioniert auch dann, wenn die UTC-offset war in der Vergangenheit anders. Aber man kann es nicht (wie auch
time.mktime()
) fix mehrdeutig Zeiten (tz.localize()
picksis_dst=False
Zeit standardmäßig).tz.normalize()
aufgerufen, um anpassen nicht vorhandene Zeiten z.B., denjenigen entsprechen, die für ein start-of-Sommerzeit-übergang (es sollte das Ergebnis nicht beeinflussen).Der obige code geht davon aus, dass
last_updated
ist eine naive datetime-Objekt (nicht zugeordnet timezone info). Wennlast_updated
ist eine bewusst datetime-Objekt, dann ist es einfach zu konvertieren von UTC:Allgemeiner Hinweis: Sie sollten jetzt verstehen, warum die Menschen empfehlen die Arbeit mit der UTC-Zeit und die lokale Zeit verwenden, nur für die Anzeige.
Nur zu klar unsere einige Dinge, denn ich glaube nicht, dass alle von uns nutzen die
time
Python-lib.Wenn Sie
datetime
, die vor allem in Django eine sehr gängige Praxis, wenn man den Vergleich so:es wird enorm scheitern. Dies ist, weil Sie nicht vergleichen können
datetime.timedelta
zuint
.Die Lösung ist, konvertieren Sie Ihre Objekte auf Sekunden.
Zum Beispiel:
Hoffe, ich half wer konfrontiert Probleme auf, die.
Jubel
timedelta(1)
in meiner Antwort 2. Hinweis: was meine Antwort sagt überdatetime.now()
und warum sollte es nicht verwendet werden. 3. django entspricht dem letzten code-Beispiel in meiner Antwort mit timezone-bewusst-datetime-Objekte (einfacher Fall) -- stellen Sie sicher, dassUSE_TZ=True
und verwendentimezone.now()
stattdatetime.now()
.total_seconds()
Nutzung, wenn nötig. Ich bin völlig einverstanden mit dertimezone.now()
btw.