2011-07-19 2 views
55

Учитывая приведенный ниже код python, пожалуйста, помогите мне понять, что там происходит.Понимание timedelta

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

uptime = end_time - start_time 

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

Так что я получить разницу между start time и end time, в строке 5 I округлить продолжительность литья и что теперь, что дальнейшее объяснение?

Я знаю, что значит дельта (среднее или разность), но почему я должен пройти seconds = uptime к timedelta и почему отливка строка работает так хорошо, что я получаю HH:MM:SS?

ответ

74

Поскольку timedelta определяется как:

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

All arguments are optional and default to 0. 

Вы можете легко сказать, «Три дня и четыре миллисекунды» с дополнительными аргументами, которые путем.

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

И для литья ул, она возвращает хороший отформатированный значение вместо __repr__. Для улучшения удобочитаемости. Из документации:

ул (T) Возвращает строку в форме [D день [с],] [Н] Н: ММ: СС [.UUUUUU], , где D является отрицательным при отрицательном т. (5)

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

Checkout документация:

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

10

почему я должен пройти секунды = безотказную работу в timedelta

Поскольку timedelta объекты могут быть переданы секунды, миллисекунды, дни и т.д ... так что вы должны указать, что вы переходящие в (вот почему вы используете явный ключ). Типизация до int является излишней, поскольку они также могут принимать поплавки.

и почему отливка струн работает так хорошо, что я получаю ЧЧ: ММ: СС?

Это не тип, который форматирует, является внутренним методом __str__ объекта. На самом деле вы получите тот же результат, если вы пишете:

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

Вы намекаете на это, но это стоит явно отметить, что timedelta делает гораздо больше, чем дисплей вещи в ЧЧ: ММ: СС. Объект timedelta используется всякий раз, когда вам нужно брать разницу между двумя объектами datetime. – Wilduck

+1

Это не метод '__repr__', это метод' __str__'. – utdemir

+1

Не '__repr __()' timedelta, а метод '__str __()'. 'print' вызывает' __str() __ 'для вас. – bgporter

Смежные вопросы