Python: convert seconds to hh:mm:ss

59 python django time

Please, how to convert an int (number a seconds) to these formats: mm:ss or hh:mm:ss ?

I need to do this with Python code (and if possible in a Django template ?).

Thank you very much ;-)

Ale*_*lli 121

我无法相信任何一个答案给出了我认为的"一种明显的方法"(而且我甚至不是荷兰人......! - ) - 最多不到24小时的价值秒(具体为86399秒):

>>> import time
>>> time.strftime('%H:%M:%S', time.gmtime(12345))
'03:25:45'
Run Code Online (Sandbox Code Playgroud)

在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'
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,只能工作一天——当然,你的解决方案也是如此,它以不同的方式分解而不是“环绕”,因为 `str(datetime.timedelta(seconds=86400))` 说“1 天”;-) (3认同)
  • 虽然这是一个小问题,这可能与 OP `time.strftime('%H:%M:%S', time.gmtime(864001))` 无关,返回一个令人讨厌的惊喜。 (2认同)

Sil*_*ost 72

>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
Run Code Online (Sandbox Code Playgroud)

  • @Glenn:伙计,你在那里杀死了我那个理想主义的高马.即使它不是完美的模型,它*也会回答他的问题.(手动必须附加或前置"0"并不是一个繁重的负担.) (7认同)
  • h:mm:sss 不是 hh:mm:ss。 (5认同)
  • @Glenn:这很不错......如果OP希望进一步格式化,那么这并不是火箭科学. (3认同)
  • 它没有回答他的问题,或者提供任何可以使他对他的问题有一个好答案的东西 - 最好你必须手动预装0或剥离"0:",这不是一个好的解决方案在所有(取决于timedelta .__ str__行为,据我所知,在任何地方都没有指定,所以它可能会改变).所以,是的. (2认同)
  • 我认为你只是忽略了这一点,OP需要**可读**格式的秒数.这才是最重要的. (2认同)
  • 他没有说“像这样格式化”,他给出了特定的格式。我无法计算我以这种方式格式化的次数。编辑字符串意味着您依赖于 timedelta 字符串格式的特定行为(如果 s[0:2] == "0:": ...),这是一个坏主意。也许timedelta现在不会决定在某些语言环境中将其格式化为“h.mm.ss”,但没有什么说它将来不能。这只是一个糟糕的方法。 (2认同)
  • 我真的很喜欢这个,因为它可以以一种很好的方式处理秒>一天,甚至可以处理几分之一秒:`str(datetime.timedelta(seconds=1111111.11))`结果是'12 days, 20:38:31.110000 '。正是我正在寻找的:) (2认同)

Gle*_*ard 21

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

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"
Run Code Online (Sandbox Code Playgroud)

你可以 - 并且可能应该 - 将它存储为timedelta而不是int,但这是一个单独的问题,timedelta实际上并没有使这个特定任务变得更容易.

  • 没有。根本不是蟒蛇式的。 (3认同)
  • 您可以使用 divmod 稍微缩短计算时间。 (2认同)

Mat*_*ell 13

你读过日期时间模块了吗?

编辑/更新: SilentGhost的答案有我的答案遗漏的细节.如果你喜欢这个答案,也可以+1(或者代替).转贴于此处:

>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
Run Code Online (Sandbox Code Playgroud)

  • @Glenn:从问题来看,很明显格式要求相当不固定。并且更容易转换为字符串并且对 `h:mm:ss` 感到满意然后乘以试图获得 `hh:mm:ss` 的脏黑客。 (2认同)
  • @GlennMaynard 如果需要“hh”,一个简单的“.zfill(7)”将处理它。 (2认同)

sth*_*sth 8

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

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

print "%02d:%02d:%02d" % (hours, minutes % 60, seconds % 60)
print "%02d:%02d" % (minutes, seconds % 60)
Run Code Online (Sandbox Code Playgroud)

//是蟒蛇整数除法.


Pau*_*McG 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)
Run Code Online (Sandbox Code Playgroud)

打印:

63:20
01:03:20
01:03:20.123
Run Code Online (Sandbox Code Playgroud)