7 ответов:
С помощью
divmod()функция, которая делает только одно деление для получения как частного, так и остатка, вы можете получить результат очень быстро только с двумя математическими операциями:m, s = divmod(seconds, 60) h, m = divmod(m, 60) print "%d:%02d:%02d" % (h, m, s)
Я вряд ли могу назвать это простым способом (по крайней мере, я не могу вспомнить синтаксис), но можно использовать времени.strftime, что дает больше контроля над форматированием:
>>> import time >>> time.strftime("%H:%M:%S", time.gmtime(666)) '00:11:06'gmtime используется для преобразования секунд в специальный формат кортежа, который
strftime()требует.
>>> import datetime >>> "{:0>8}".format(datetime.timedelta(seconds=66)) >>> "{:0>8}".format(str(datetime.timedelta(seconds=66))) # Python3 >>> '00:01:06' # goodи:
>>> "{:0>8}".format(datetime.timedelta(seconds=666777)) >>> "{:0>8}".format(str(datetime.timedelta(seconds=666777))) # Python3 >>> '7 days, 17:12:57' # niceбез ':0>8':
>>> "{}".format(datetime.timedelta(seconds=66)) >>> '0:01:06' # not HH:MM:SSи:
>>> import time >>> time.strftime("%H:%M:%S", time.gmtime(666777)) >>> '17:12:57' # wrongно:
>>> "{:0>8}".format(datetime.timedelta(seconds=620000)) >>> "{:0>8}".format(str(datetime.timedelta(seconds=620000))) # Python3 >>> '7 days, 4:13:20' # bummer
Это мой быстрый трюк:
import humanfriendly humanfriendly.format_timespan(secondsPassed)визит: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan для дополнительной информации.
Если вам нужно получить
datetime.timeзначение, вы можете использовать этот трюк:my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()вы не можете добавлять
timedeltaдоtime, но можно добавить его вdatetime.UPD: еще одна вариация той же техники:
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()вместо
1вы можете использовать любое число больше 0. Здесь мы используем тот факт, чтоdatetime.fromordinalвсегда будет возвращатьdatetimeобъектtimeкомпонент равны нулю.
вот как я его получил.
def sec2time(sec, n_msec=3): ''' Convert seconds to 'D days, HH:MM:SS.FFF' ''' if hasattr(sec,'__len__'): return [sec2time(s) for s in sec] m, s = divmod(sec, 60) h, m = divmod(m, 60) d, h = divmod(h, 24) if n_msec > 0: pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec) else: pattern = r'%02d:%02d:%02d' if d == 0: return pattern % (h, m, s) return ('%d days, ' + pattern) % (d, h, m, s)примеры:
$ sec2time(10, 3) Out: '00:00:10.000' $ sec2time(1234567.8910, 0) Out: '14 days, 06:56:07' $ sec2time(1234567.8910, 4) Out: '14 days, 06:56:07.8910' $ sec2time([12, 345678.9], 3) Out: ['00:00:12.000', '4 days, 00:01:18.900']
Comments