Понимание timedelta - PullRequest
       8

Понимание timedelta

80 голосов
/ 19 июля 2011

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

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 я округляю продолжительность наприведение и что теперь, каково дальнейшее объяснение?

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

Ответы [ 2 ]

108 голосов
/ 19 июля 2011

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

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

Все аргументы являются необязательными и по умолчанию равны 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)

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

str (t) Возвращает строку в форме [D day [s],] [H] H: MM: SS [.UUUUUU], где D отрицательно для отрицательного t,(5)

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

Оформление документации:

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

12 голосов
/ 19 июля 2011

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

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

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

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

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