Оговорюсь сразу, тем кому за глаза хватает print(datetime.timedelta(seconds=99660))
для форматирования и понимания содержимого datetime.timedelta
могут смело не читать дальше.
Мне же приходится работать с datetime.timedelta
очень часто и потому меня совершенно не устраивали встроенные возможности форматирования дельт. Чего мне не хватало больше всего так это вывода дельты в формате "G:i"
, говоря языком встроенного шаблонного фильтра date
, т.е. показать общее кол-во часов и кол-во минут (не всех, а только остатка) для дельты. Именно для удовлетворения этих нужд я начал писать связку функций str_to_timedelta
/ timedelta_to_str
, которые пару часов назад приняли окончательный вид.
Как они работают? Очень просто,
>>> import datetime
>>> from kikola.utils import str_to_timedelta, timedelta_to_str
>>> delta = datetime.timedelta(seconds=99660)
>>> timedelta_to_str(delta)
... u'27:41'
>>> timedelta_to_str(delta, 'd l, h:i:s')
... u'1 day, 03:41:00'
>>> timedelta_to_str(delta, 'f')
... u'1d 3:41'
>>> timedelta_to_str(delta, 'F')
... u'1 day, 3:41'
>>> timedelta_to_str(delta, 'S')
... u'99660'
>>> str_to_timedelta('27:41') == delta
... True
>>> timedelta_to_str('1 day, 03:41:00', 'd l, h:i:s') == delta
... True
>>> str_to_timedelta('1d 3:41') == delta
... True
>>> str_to_timedelta('1 day, 3:41') == delta
... True
>>> str_to_timedelta('99660', 'S') == delta
... True
Как видите, все действительно просто. Плюс к тому, если вам нужно использовать эти функции в шаблонах, вы можете воспользоваться фильтром timedelta
из шаблонной библиотеки timedelta_tags
.
{% load timedelta_tags %}
{{ delta|timedelta:"G:i:s" }}
Весь этот код довольно успешно живет в моем проекте kikola, полностью покрыт тестами и работает с Django 1.0+. Чтобы окончательно не углубляться, скажу только, что вы можете посмотреть все доступные форматы для форматирования в комментариях к timedelta_to_str
, а также при частом использовании формата, отличного от дефолтного "G:i"
вы можете указать его в TIMEDELTA_FORMAT
переменной в настройках проекта, и затем str_to_timedelta
и timedelta_to_str
будут использовать указанный формат, как формат по умолчанию.