2010-10-13 6 views
15

Ich habe zwei Zeitobjekte.Python Zeitunterschiede

Beispiel

time.struct_time(tm_year=2010, tm_mon=9, tm_mday=24, tm_hour=19, tm_min=13, tm_sec=37, tm_wday=4, tm_yday=267, tm_isdst=-1) 

time.struct_time(tm_year=2010, tm_mon=9, tm_mday=25, tm_hour=13, tm_min=7, tm_sec=25, tm_wday=5, tm_yday=268, tm_isdst=-1) 

ich den Unterschied der beiden letztgenannten haben wollen. Wie könnte ich das tun? Ich brauche nur Minuten und Sekunden, sowie die Dauer dieser beiden.

+1

Sehen Sie: http://StackOverflow.com/Questions/1697815/How-do-you-convert-a-python-time-struct-time-Object-into-a-Datetime-Object – shahjapan

+0

Zeitzone-bewusste Antwort : [Finden, ob 24 Stunden zwischen den Datumsangaben vergangen sind - Python] (http://stackoverflow.com/a/26313848/4279) – jfs

Antwort

20

Time Instanzen unterstützen die Subtraktionsoperation nicht. Da eine Möglichkeit, dies zu lösen, wäre die Zeit Sekunden seit Epoche zu konvertieren und dann finden Sie den Unterschied, zu verwenden:

>>> t1 = time.localtime() 
>>> t1 
time.struct_time(tm_year=2010, tm_mon=10, tm_mday=13, tm_hour=10, tm_min=12, tm_sec=27, tm_wday=2, tm_yday=286, tm_isdst=0) 
>>> t2 = time.gmtime() 
>>> t2 
time.struct_time(tm_year=2010, tm_mon=10, tm_mday=13, tm_hour=4, tm_min=42, tm_sec=37, tm_wday=2, tm_yday=286, tm_isdst=0) 

>>> (time.mktime(t1) - time.mktime(t2))/60 
329.83333333333331 
+2

In Python 3 gibt die Funktion mktime die Anzahl der Sekunden seit der Epoche zurück und braucht daher nicht durch zu dividieren 60. –

+0

lokale Zeit kann mehrdeutig sein, deshalb kann 'mktime()' ein falsches Ergebnis liefern (50% Chance bei Ende der Sommerzeit-Übergänge oder falsch für vergangene Tage, wenn die historische tz-Datenbank nicht verwendet wird). Es ist falsch, die UTC-Zeit (das Ergebnis von 'gmtime()') zu übergeben, es sei denn, die lokale Zeitzone ist UTC. – jfs

+0

@AdamOren: 'mktime()' * immer * gibt "Sekunden sicne die Epoche" zurück. '/ 60' gibt die Anzahl der Minuten zurück, wie OP fragt. Ich würde 'minutes, seconds = divmod (seconds, 60)' verwenden, um Minuten, Sekunden getrennt zu erhalten oder 'templeta' zu verwenden, wie [@jweyrich vorgeschlagen] (http://stackoverflow.com/a/3920862/4279). – jfs

2

Sie können time.mktime(t) mit dem Objekt struct_time (übergeben als "t") verwenden, um es in einen Gleitkommawert "Sekunden seit Epoche" zu konvertieren. Dann können Sie diese subtrahieren, um die Differenz in Sekunden zu erhalten, und durch 60 dividieren, um die Differenz in Minuten zu erhalten.

16
>>> t1 = time.mktime(time.strptime("10 Oct 10", "%d %b %y")) 
>>> t2 = time.mktime(time.strptime("15 Oct 10", "%d %b %y")) 
>>> print(datetime.timedelta(seconds=t2-t1)) 
5 days, 0:00:00 
+2

['mktime()' kann ein falsches Ergebnis zurückgeben] (http://stackoverflow.com/a/26313848/4279) – jfs

+0

Funktioniert nicht für Python 3.6: 'errorMessage:" nicht unterstützte Operandentyp (en) für -: "time.struct_time" und "time.struct_time" – Suncatcher

+0

@Suncatcher huh? Es funktioniert gut mit python3 - siehe http://imgur.com/a/3rbhW – jweyrich

2

Es gibt einen anderen Weg, um die Zeitdifferenz zwischen zwei Terminen zu finden (keine besser als die vorherige Lösung, denke ich):

>>> import datetime 
>>> dt1 = datetime.datetime.strptime("10 Oct 10", "%d %b %y") 
>>> dt2 = datetime.datetime.strptime("15 Oct 10", "%d %b %y") 
>>> (dt2 - dt1).days 
5 
>>> (dt2 - dt1).seconds 
0 
>>> 

Es wird den Unterschied in Tagen oder Sekunden oder Kombination davon geben. Der Typ für (dt2 - dt1) ist datetime.timedelta. Weitere Informationen finden Sie unter library.