Python:将秒转换为hh:mm:ss
请,如何将int(数字秒)转换为这些格式: mm:ss或hh:mm:ss ?
我需要用Python代码(如果可能的话,在Django模板?)。
非常感谢你 ;-)
我无法相信任何一个答案给出了我认为“一个显而易见的方式来做到这一点”(我甚至不是荷兰人……) – 最多只有24小时的价值秒(86399秒,具体):
>>> import time >>> time.strftime('%H:%M:%S', time.gmtime(12345)) '03:25:45'
由于time
filter支持时髦的时间格式语法(我相信,来自PHP),并且还需要datetime模块和时区实现(如pytz)来准备数据,所以在Django模板中做这件事更加挑剔。 例如:
>>> 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'
根据您的确切需要,在您的应用中为此格式化任务定义自定义filter可能会更方便。
>>> a = datetime.timedelta(seconds=65) datetime.timedelta(0, 65) >>> str(a) '0:01:05'
代码完成所请求的内容,并带有示例,并显示他没有指定的情况如何处理:
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实际上并没有使这个特定的任务变得更容易。
你读过date时间模块吗?
编辑/更新: SilentGhost的答案有我的答案遗漏的细节。 如果你喜欢这个答案,也可以+1(或者相反)。 在这里转贴:
>>> a = datetime.timedelta(seconds=65) datetime.timedelta(0, 65) >>> str(a) '0:01:05'
如果你使用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
您可以通过简单的划分从秒数中计算分钟数和小时数:
seconds = 12345 minutes = seconds // 60 hours = minutes // 60 print "%02d:%02d:%02d" % (hours, minutes % 60, seconds % 60) print "%02d:%02d" % (minutes, seconds % 60)
这里//
是python整数除法。
除以60之后要小心:整数之间的除法将返回一个整数 – > 12/60 = 0,除非您从未来导入除法。 以下是从Python 2.6.2复制和粘贴:
IDLE 2.6.2 >>> 12/60 0 >>> from __future__ import division >>> 12/60 0.20000000000000001
不是一个Python的人,但最简单的没有任何图书馆只是:
total = 3800 seconds = total % 60 total = total - seconds hours = total / 3600 total = total - (hours * 3600) mins = total / 60
更新的代码,谢谢
除了Python已经支持date和时间(请参阅bigmattyh的回复)之外,从几秒钟开始查找分钟或小时也很容易:
minutes = seconds / 60 hours = minutes / 60
现在,当你想显示分钟或秒钟时,将它们调整60,使它们不会大于59
如果你需要做很多事情,你可以预先计算一天中秒数的所有可能的string:
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
现在秒转换为格式string是一个快速的字典查找:
print hhmmss[12345]
版画
'03:25:45'