25 ноября 2010 г.

Форматируем datetime.timedelta в что-то человеко-читаемое

Оговорюсь сразу, тем кому за глаза хватает 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 будут использовать указанный формат, как формат по умолчанию.

blog comments powered by Disqus