Python:将秒转换为hh:mm:ss

时间:2009-09-05 22:30:57

标签: python django time

请问,如何将int(数字秒数)转换为以下格式: mm:ss hh:mm:ss

我需要使用Python代码(如果可能的话,在Django模板中执行此操作?)。

非常感谢你; - )

10 个答案:

答案 0 :(得分:109)

我无法相信许多答案中的任何一个都会给出我认为“一种明显的方法”(并且我甚至不是荷兰人......! - ) - 直到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'

根据您的具体需求,在您的应用中为此格式化任务定义自定义过滤器可能会更方便。

答案 1 :(得分:64)

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

答案 2 :(得分:20)

执行所请求的代码,带有示例,并显示他未指定的案例如何处理:

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实际上并没有使这个特定任务变得更容易。

答案 3 :(得分:11)

您是否已阅读datetime模块?

编辑/更新:SilentGhost的答案包含我的答案遗漏的详细信息。如果你喜欢这个答案,也可以+1(或者代替)。转载于此处:

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

答案 4 :(得分:7)

您可以通过简单划分从秒数计算分钟数和小时数:

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

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

这里//是蟒蛇整数除法。

答案 5 :(得分:7)

如果你使用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

答案 6 :(得分:1)

除以60时要小心:整数之间的除法返回一个整数 - > 12/60 = 0除非您从将来导入分部。 以下是从Python 2.6.2中复制和粘贴:

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

答案 7 :(得分:0)

除了Python内置了对日期和时间的支持(参见bigmattyh的回复)之外,从秒开始查找分钟或小时很容易:

minutes = seconds / 60
hours = minutes / 60

现在,当你想要显示分钟或秒数时,将它们修改为60,这样它们就不会大于59

答案 8 :(得分:0)

不是蟒蛇人,但最简单的是没有任何图书馆:

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

更新了代码,谢谢......

答案 9 :(得分:0)

如果你需要做很多事情,你可以在一天内预先计算所有可能的字符串:

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

hhmmss = {}
i = 0
for (h,m,s) in product(range(24),range(60),range(60)):
    hhmmss[i] = "%02d:%02d:%02d" % (h,m,s)
    i += 1

现在将秒转换为格式字符串是一个快速的字典查找:

print hhmmss[12345]

打印

'03:25:45'