2013-10-25 4 views
9

Ich versuche, mich um das Datetime-Modul zu kümmern. Ich kenne die Zeit jetzt als eine Epoche und die Zeit, in der ein Ereignis zuletzt geschah (als eine epochale Zeit). Was ich tun muss, ist herauszufinden, ob dieses Ereignis zwischen Mitternacht und Mitternacht von gestern passiert ist.Was war gestern Mitternacht als Epoche?

t = time.time() # is now 
t2 = 1234567890 # some arbitrary time from my log 

Vor 24 Stunden ist t - 86400, aber wie kann ich das bis Mitternacht auf und ab runden. Ich habe wirklich Schwierigkeiten, einen Weg zu finden, um Zeitstempel in und außerhalb der Datetime zu bekommen oder dann eine Datetime zu manipulieren, um die Zeit einzustellen.

+1

Klingt, als ob Sie es in * reguläre * Zeit irgendwo umwandeln müssen, da Teiler wie Tage/Mitternacht/etc kein Teil von Epochen sind. – Gray

Antwort

30

die letzte Mitternacht zu erzeugen ist einfach:

from datetime import datetime, date, time 

midnight = datetime.combine(date.today(), time.min) 

Das heutige Datum vereint, zusammen mit time.min um Mitternacht ein datetime Objekt zu bilden.

Mit einem timedelta() können Sie die vorherigen Mitternacht berechnen:

from datetime import timedelta 

yesterday_midnight = midnight - timedelta(days=1) 

Alles was Sie jetzt tun müssen, ist Test, wenn Ihr Zeitstempel zwischen diesen beiden Punkten:

timestamp = datetime.fromtimestamp(some_timestamp_from_your_log) 
if yesterday_midnight <= timestamp < midnight: 
    # this happened between 00:00:00 and 23:59:59 yesterday 

Kombinierter in eine Funktion:

from datetime import datetime, date, time, timedelta 

def is_yesterday(timestamp): 
    midnight = datetime.combine(date.today(), time.min) 
    yesterday_midnight = midnight - timedelta(days=1) 
    timestamp = datetime.fromtimestamp(some_timestamp_from_your_log) 
    return yesterday_midnight <= timestamp < midnight: 
+0

Wie können Sie feststellen, wenn Mitternacht ohne Angabe der Zeitzone ist? – sdanzig

+0

@sdanzig: Standardmäßig ist das Modul "datetime" nicht zeitzonenabhängig. Es kann lokale oder UTC-Zeiten zurückgeben, wie vom Betriebssystem bereitgestellt. Dieser Code verwendet die lokale Zeit. –

+1

In diesem Fall ist es kein Problem, da alles in UTC läuft. – t0mmyt

1

Bei einer solchen Zeitstempel, können Sie divmod verwenden, um die Anzahl der Tage seit der Epoche zu berechnen (die Sie nicht interessieren), und wie viele Sekunden sind Überbleibsel (was Sie tun):

days_since, remaining_seconds = divmod(t, 24*3600) # Divide by number of seconds in one day 

Dann subtrahieren Sie die verbleibenden Sekunden von Ihrem ursprünglichen Zeitstempel, der Mitternacht des aktuellen Tages produziert.

t -= remaining_seconds 

Das Aufrunden ist so einfach wie das Verschieben Ihres Zielzeitstempels genau einen Tag vor dem Abrunden.

tomorrow_t = t + 24 * 3600 
days_since, remaining_seconds = divmod(tomorrow_t, 24*3600) 
t = tomorrow_t - remaining_seconds 
+0

Ich dachte über diesen Ansatz nach, ich ging eigentlich nur zu Mod 86400, aber dann erinnerte ich mich an Schaltsekunden. – t0mmyt

+1

Diese Zeitstempel sind nicht von Schaltsekunden betroffen. Wenn eine Schaltsekunde auftritt, wird der UNIX-Epochen-Zeitstempel einfach wiederholt, sodass Sie garantiert 86400 Sekunden pro Tag haben. Das Wiederholen eines Zeitstempels ist nur eine weitere willkürliche Bezeichnung für die Schaltsekunde, wie '23: 59: 60' ist eine willkürliche Bezeichnung für die Schaltsekunde zwischen 23:59:59 und 00:00:00 (oder wenn Schaltsekunden angewendet werden). – chepner

0

Nach meiner Einschätzung sind viele Datum und Zeit Manipulationen leichter zu tun, und zu verstehen, die Bibliothek Pfeil verwenden. Dies ist einer von ihnen.

Erstellen Sie ein beliebiges Datum und eine beliebige Uhrzeit.

>>> import arrow 
>>> arbitrary = arrow.get(2017,8,16,11,5) 

berechnen midnight_yesterday: Erstens, Mitternacht von arbitrary als 'Tag' floor; dann shift das um einen Tag zurück. Zeigen Sie das Ergebnis an.

>>> midnight_yesterday = arbitrary.floor('day').shift(days=-1) 
>>> midnight_yesterday 
<Arrow [2017-08-15T00:00:00+00:00]> 

Verwendung timestamp für das gewünschte Gesamtergebnis für Python 3.3+.

>>> midnight_yesterday.datetime.timestamp() 
1502755200.0 

Oder verwenden Sie diesen Ausdruck für Python 2.7. (Credit: https://stackoverflow.com/a/11743262/131187 für die beiden letzteren Ausdrücke.)

>>> (midnight_yesterday-arrow.get(1970,1,1)).total_seconds() 
1502755200.0 
Verwandte Themen