Zrozumienie timedelta


90

Biorąc pod uwagę poniższy kod Pythona, pomóż mi zrozumieć, co się tam dzieje.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Więc dostaję różnicę między start timea end time, w linii 5 zaokrąglam czas trwania przez rzucanie i co teraz, jakie jest dalsze wyjaśnienie?

Wiem, co oznacza delta (średnia lub różnica), ale dlaczego muszę przejść seconds = uptimedo timedeltai dlaczego rzucanie struny działa tak dobrze, że otrzymuję HH:MM:SS?

Odpowiedzi:


115

Ponieważ timedelta definiuje się następująco:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Wszystkie argumenty są opcjonalne i domyślnie mają wartość 0.

Możesz łatwo powiedzieć „Trzy dni i cztery milisekundy” z opcjonalnymi argumentami w ten sposób.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

W przypadku rzutowania str zwraca ładną sformatowaną wartość zamiast __repr__poprawić czytelność. Z dokumentów:

str (t) Zwraca ciąg w postaci [D dzień [dni],] [H] H: MM: SS [.UUUUUU], gdzie D jest ujemne dla ujemnego t. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Dokumentacja do kasy:

http://docs.python.org/library/datetime.html#timedelta-objects


13

dlaczego muszę przechodzić sekundy = uptime do timedelta

Ponieważ obiektom timedelta można przekazywać sekundy, milisekundy, dni itp ... więc musisz określić, co przekazujesz (dlatego używasz jawnego klucza). Rzutowanie na typ intjest zbędne, ponieważ mogą również akceptować spławiki.

i dlaczego odlewanie struny działa tak dobrze, że otrzymuję HH: MM: SS?

Formatowanie nie jest typowe, jest wewnętrzną __str__metodą obiektu. W rzeczywistości osiągniesz ten sam wynik, jeśli napiszesz:

print datetime.timedelta(seconds=int(uptime))

1
Sugerujesz, ale warto wyraźnie zauważyć, że timedelta robi o wiele więcej niż wyświetlanie rzeczy w formacie HH: MM: SS. Obiekt timedelta jest używany zawsze, gdy trzeba wziąć różnicę między dwoma obiektami daty i godziny.
Wilduck

1
To nie jest __repr__metoda, to jest __str__metoda.
utdemir

1
Nie __repr__()timedelta, ale jej __str__()metoda. printwoła __str()__do ciebie.
bgporter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.