2010-10-13 13 views
15

Mam dwa obiekty czasowe.Różnice czasu w Pythonie

Przykład

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) 

chcę mieć różnicę tych dwóch. Jak mogłem to zrobić? Potrzebuję tylko minut i sekund, a także czas trwania tych dwóch.

+1

Spójrz na: http://stackoverflow.com/questions/1697815/how-do-you-convert-a-python-time-struct-time-object-into-a-datetime-object – shahjapan

+0

odpowiedź dotycząca timezone : [Znajdź, czy 24 godziny upłynęły między datetimes - Python] (http://stackoverflow.com/a/26313848/4279) – jfs

Odpowiedz

20

instancje nie obsługują operacji odejmowania. Biorąc pod uwagę, że jednym ze sposobów rozwiązania tego problemu byłoby przekształcić czas sekund od epoki, a następnie znajdź różnicę, przeznaczenie:

>>> 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

W python 3 funkcja mktime zwraca liczbę sekund od epoki, a zatem nie ma potrzeby dzielenia przez 60. –

+0

Czas lokalny może być niejednoznaczny, dlatego 'mktime()' może zwracać błędny wynik (50% szansy podczas przejścia na koniec DST lub po prostu źle dla przeszłych dat, jeśli nie jest używana historyczna baza danych tz). Nieprawidłowe jest podawanie czasu UTC (wynik 'gmtime()'), chyba że lokalna strefa czasowa to UTC. – jfs

+0

@AdamOren: 'mktime()' * zawsze * zwraca "sekundy sicne epoka". '/ 60' zwraca liczbę minut, o jaką OP prosi. Użyłbym 'minutes, seconds = divmod (seconds, 60)' aby uzyskać minuty, sekundy oddzielnie lub użyj 'timedelta' jako [@jweyrich recommended] (http://stackoverflow.com/a/3920862/4279). – jfs

2

Możesz użyć time.mktime(t) z obiektem struct_time (przekazanym jako "t"), aby przekonwertować go na wartość zmiennoprzecinkową "sekundy od epoki". Następnie można je odjąć, aby uzyskać różnicę w sekundach i podzielić przez 60, aby uzyskać różnicę w minutach.

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()' może zwrócić nieprawidłowy wynik] (http://stackoverflow.com/a/26313848/4279) – jfs

+0

Nie działa dla Pythona 3.6: 'errorMessage:" nieobsługiwany typ (y) argumentu dla -: 'time.struct_time' i 'time.struct_time' – Suncatcher

+0

@Suncatcher huh? Działa dobrze z python3 - zobacz http://imgur.com/a/3rbhW – jweyrich

2

Nie ma innego sposobu, aby znaleźć różnicę czasu między dwoma datami (brak lepiej niż w poprzednim rozwiązaniu, chyba):

>>> 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 
>>> 

To daje różnicę w dniach lub sekund lub kombinacji tego. Typ dla (dt2 - dt1) to datetime.timedelta. Zajrzyj do library w celu uzyskania dalszych szczegółów.

Powiązane problemy