Конвертировать секунды в чч: мм: сс в Python

Как преобразовать целое число (количество секунд) в форматы мм: сс или чч: мм: сс?

Мне нужно сделать это с помощью кода Python (и, если возможно, в шаблоне Django).

Ответ 1

Я не могу поверить, что любой из многих ответов дает то, что я считаю "одним очевидным способом сделать это" (и я даже не голландский...! -) - до чуть ниже 24 часов "стоит секунд (86399 секунд, в частности):

>>> import time
>>> time.strftime('%H:%M:%S', time.gmtime(12345))
'03:25:45'

Выполнение этого в шаблоне Django более искусно, так как фильтр time поддерживает фанковый синтаксис форматирования времени (вдохновленный, я полагаю, из PHP), а также модуль datetime, а также временную реализацию, такую ​​как pytz, для подготовки данных. Например:

>>> from django import template as tt
>>> import pytz
>>> import datetime
>>> tt.Template('{{ x|time:"H:i:s" }}').render(
...     tt.Context({'x': datetime.datetime.fromtimestamp(12345, pytz.utc)}))
u'03:25:45'

В зависимости от ваших конкретных потребностей было бы удобнее определить настраиваемый фильтр для этой задачи форматирования в вашем приложении.

Ответ 2

>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'

Ответ 3

Код, который делает то, что было запрошено, с примерами и показывает, как обрабатываются случаи, которые он не задал:

def format_seconds_to_hhmmss(seconds):
    hours = seconds // (60*60)
    seconds %= (60*60)
    minutes = seconds // 60
    seconds %= 60
    return "%02i:%02i:%02i" % (hours, minutes, seconds)

def format_seconds_to_mmss(seconds):
    minutes = seconds // 60
    seconds %= 60
    return "%02i:%02i" % (minutes, seconds)

minutes = 60
hours = 60*60
assert format_seconds_to_mmss(7*minutes + 30) == "07:30"
assert format_seconds_to_mmss(15*minutes + 30) == "15:30"
assert format_seconds_to_mmss(1000*minutes + 30) == "1000:30"

assert format_seconds_to_hhmmss(2*hours + 15*minutes + 30) == "02:15:30"
assert format_seconds_to_hhmmss(11*hours + 15*minutes + 30) == "11:15:30"
assert format_seconds_to_hhmmss(99*hours + 15*minutes + 30) == "99:15:30"
assert format_seconds_to_hhmmss(500*hours + 15*minutes + 30) == "500:15:30"

Вы можете - и, вероятно, должны - хранить это как timedelta, а не int, но что отдельная проблема и timedelta на самом деле не делают эту задачу проще.

Ответ 4

Читайте о модуле datetime.

Ответ SilentGhost содержит подробности, на которые мой ответ опущен и размещен здесь:

>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'

Ответ 5

Вы можете рассчитать количество минут и часов из количества секунд простым делением:

seconds = 12345
minutes = seconds // 60
hours = minutes // 60

print "%02d:%02d:%02d" % (hours, minutes % 60, seconds % 60)
print "%02d:%02d" % (minutes, seconds % 60)

Здесь // - целочисленное деление Python.

Ответ 6

Если вы используете divmod, вы невосприимчивы к различным видам целочисленного деления:

# show time strings for 3800 seconds

# easy way to get mm:ss
print "%02d:%02d" % divmod(3800, 60)

# easy way to get hh:mm:ss
print "%02d:%02d:%02d" % \
    reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
        [(3800,),60,60])


# function to convert floating point number of seconds to
# hh:mm:ss.sss
def secondsToStr(t):
    return "%02d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

print secondsToStr(3800.123)

Печать:

63:20
01:03:20
01:03:20.123

Ответ 7

Просто будьте осторожны при делении на 60: деление между целыми числами возвращает целое число → 12/60 = 0, если вы не импортируете подразделение из будущего. Ниже приведено копирование и вставка из Python 2.6.2:

IDLE 2.6.2      
>>> 12/60
0
>>> from __future__ import division
>>> 12/60
0.20000000000000001

Ответ 8

Если вам нужно сделать это много, вы можете предварительно рассчитать все возможные строки за количество секунд в дне:

try:
    from itertools import product
except ImportError:
    def product(*seqs):
        if len(seqs) == 1:
            for p in seqs[0]:
                yield p,
        else:
            for s in seqs[0]:
                for p in product(*seqs[1:]):
                    yield (s,) + p

hhmmss = []
for (h, m, s) in product(range(24), range(60), range(60)):
    hhmmss.append("%02d:%02d:%02d" % (h, m, s))

Теперь преобразование секунд для форматирования строки - это быстрый индексированный поиск:

print hhmmss[12345]

печатает

'03:25:45'

Ответ 9

Помимо того, что Python встроил поддержку дат и времени (см. ответ bigmattyh), найти минуты или часы с секунд легко:

minutes = seconds / 60
hours = minutes / 60

Теперь, когда вы хотите отображать минуты или секунды, измените их на 60, чтобы они не были больше 59

Ответ 10

Не будучи человеком Python, но проще всего без каких-либо библиотек просто:

total   = 3800
seconds = total % 60
total   = total - seconds
hours   = total / 3600
total   = total - (hours * 3600)
mins    = total / 60