Вопрос-Ответ

Format timedelta to string

Форматирование timedelta в строку

У меня возникли проблемы с форматированием datetime.timedelta объекта.

Вот что я пытаюсь сделать: у меня есть список объектов, и одним из членов класса object является объект timedelta, который показывает продолжительность события. Я хотел бы отобразить эту продолжительность в формате часов: минут.

Я перепробовал множество методов для этого, и у меня возникли трудности. Мой текущий подход заключается в добавлении методов в класс для моих объектов, которые возвращают часы и минуты. Я могу получить часы, разделив timedelta.seconds на 3600 и округлив его. У меня возникли проблемы с получением оставшихся секунд и преобразованием их в минуты.

Кстати, я использую Google AppEngine с шаблонами Django для презентации.

Переведено автоматически
Ответ 1

Вы можете просто преобразовать timedelta в строку с помощью str(). Вот пример:

import datetime
start = datetime.datetime(2009,2,10,14,00)
end = datetime.datetime(2009,2,10,16,00)
delta = end - start
print(str(delta))
# prints 2:00:00
Ответ 2

Как вы знаете, вы можете получить значение total_seconds из объекта timedelta, обратившись к .seconds атрибуту.

Python предоставляет встроенную функцию divmod(), которая позволяет:

s = 13420
hours, remainder = divmod(s, 3600)
minutes, seconds = divmod(remainder, 60)
print('{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds)))
# result: 03:43:40

или вы можете преобразовать в часы и остаток, используя комбинацию умножения по модулю и вычитания:

# arbitrary number of seconds
s = 13420
# hours
hours = s // 3600
# remaining seconds
s = s - (hours * 3600)
# minutes
minutes = s // 60
# remaining seconds
seconds = s - (minutes * 60)
# total time
print('{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds)))
# result: 03:43:40
Ответ 3
>>> str(datetime.timedelta(hours=10.56))
10:33:36

>>> td = datetime.timedelta(hours=10.505) # any timedelta object
>>> ':'.join(str(td).split(':')[:2])
10:30

Передача timedelta объекта в str() функцию вызывает тот же код форматирования, который используется, если мы просто вводим print td. Поскольку вам не нужны секунды, мы можем разделить строку двоеточиями (на 3 части) и собрать ее обратно, оставив только первые 2 части.

Ответ 4

Я лично использую для этого humanize библиотеку:

>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'

Конечно, это не дает вам точно тот ответ, который вы искали (который, действительно, есть str(timeA - timeB)), но я обнаружил, что как только вы выходите за пределы нескольких часов, отображение быстро становится нечитаемым. humanize поддерживает гораздо большие значения, понятные человеку, а также хорошо локализован.

По-видимому, он вдохновлен модулем Django contrib.humanize, поэтому, поскольку вы используете Django, вам, вероятно, следует использовать это.

python string datetime