如何将秒转换为小时,分钟和秒?


Answers:


760

您可以使用datetime.timedelta功能:

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'

8
恕我直言,这是最好的方法,因为您随后可以对timedelta和任何datetime对象使用算术运算。
马修·申克尔

12
这可以使用多天: str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
hyprnick

3
str(datetime.timedelta(seconds=round(666666.55)))正确渲染天数;限制小数秒。
CPBL

1
timedelta不是溢出安全的,并且不能正确执行数学运算,例如str(timedelta(hours=8) - timedelta(hours=10)),结果为,'-1 day, 22:00:00'并且基于整数的解决方案正好适合您需要的那些情况'-02:00:00'
cprn

1
+1。这个答案很容易修改。例如,如果要在打印时忽略某个字段,请使用以下命令: stackoverflow.com/questions/7999935/…–
eric_kernfeld

614

通过使用divmod()仅执行一个除法运算就可以得到商和余数的函数,您只需执行两个数学运算就可以很快得出结果:

m, s = divmod(seconds, 60)
h, m = divmod(m, 60)

然后使用字符串格式将结果转换为所需的输出:

print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+

2
如果您更喜欢运算符而不是函数,请使用模。例如(仅分钟/秒):'%d:%02dmn' % (seconds / 60, seconds % 60)
bufh 2014年

18
您可以将其扩展到几天:d, h = divmod(h, 24)
Mark Ransom

14
@MarkRansom:然后到几个月m, d = divmod(m, 31)。糟糕,不可以。更糟糕的是,如果leap秒进入游戏,您的代码将是错误的。长话短说:使用timedelta并且不要弄乱日历,它会咬你。

4
@Tibo timedelta处理deal秒吗?我怀疑不是。在许多应用程序中,这种简单的数学运算绰绰有余。
Mark Ransom

1
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))结果为'-1 day,22:00:00 '所以... idk,如果它适用于leap秒,但不适用于负数。
cprn

69

我很难说出这种简单的方法(至少我不记得语法),但是可以使用time.strftime,它提供了对格式的更多控制:

from time import strftime
from time import gmtime

strftime("%H:%M:%S", gmtime(666))
'00:11:06'

strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'

gmtime用于将秒转换为所需的特殊元组格式strftime()

注意:在23:59:59之后截断



13
不幸的是,该方法从1开始测量天数,因此它不能表示时间增量,因此这是一个等待发生的事故。例如 time.strftime('%d %H:%M:%S', time.gmtime(1))=>'1天,0:00:01'。
Riaz Rizvi

40

使用datetime

使用':0>8'格式:

from datetime import timedelta

"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

没有':0>8'格式:

"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

使用time

from time import gmtime
from time import strftime

# NOTE: The following resets if it goes over 23:59:59!

strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'

strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'

strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'

strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong

1
如果增量少于一秒,则失败:"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
jfs

1
对于其他所有人:该without ':0>8':示例缺少前导0。{:0>8}左边的零填充为零8。
TankorSmash

2
在python 3.5.2中,我收到TypeError。我正在格式化time.time()-start变量。有见识吗?TypeError: non-empty format string passed to object.__format__
medley56

我尝试使用datetime.now()而不是time.time()生成timedelta对象,但遇到了相同的错误。
medley56

@ medley56使用Python3时,str()如果要使用以下格式,则需要使用0>8"{:0>8}".format(str(datetime.timedelta(seconds=666777)))。检查此答案以获取更多信息。
Berriel


9

如果您需要获取datetime.time价值,可以使用以下技巧:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()

您不能添加timedeltatime,但可以将其添加到datetime

UPD:同一技术的另一种变化:

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()

而不是1可以使用大于0的任何数字。在这里,我们使用这样的事实,即datetime.fromordinal始终返回组件为零的datetime对象time


6

这就是我的方法。

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']

1
与上面的答案相比,这有什么好处? str(datetime.timedelta(seconds=666))
Riaz Rizvi'1

@RiazRizvi为666.0666.1值提供一致的字符串长度(以微秒为单位)。
anatoly techtonik

6

以下设置对我有用。

def sec_to_hours(seconds):
    a=str(seconds//3600)
    b=str((seconds%3600)//60)
    c=str((seconds%3600)%60)
    d=["{} hours {} mins {} seconds".format(a, b, c)]
    return d


print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']

print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']

3

dateutil.relativedelta如果您还需要访问浮点数的小时,分​​钟和秒,则非常方便。datetime.timedelta没有提供类似的界面。

from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
    int(rt.hours), int(rt.minutes), int(rt.seconds)))

版画

40.0
01:30:40

1
我的输出与您的输出不同,这使我认为您有错字。您可能打算使用seconds=5440而不是seconds=5540。不过,我喜欢您的回答!
JL

2

小时(h)由楼层的秒数(//)除以3600(60分钟/小时* 60秒/分钟)

分钟(m),以剩余秒数(小时计算的剩余百分比,%)除以60(60秒/分钟)计算得出

类似地,以小时和分钟的余数计算秒数。

其余只是字符串格式!

def hms(seconds):
    h = seconds // 3600
    m = seconds % 3600 // 60
    s = seconds % 3600 % 60
    return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

print(hms(7500))  # Should print 02h05m00s

尽管此代码可以为OP的问题提供解决方案,但最好添加有关其原因/工作方式的上下文。这可以帮助将来的用户学习并将该知识应用于他们自己的代码。当解释代码时,您还可能以投票的形式从用户那里获得积极的反馈。
borchvm

2
就是这样,谢谢@borchvm指出!
山姆

-2

您可以将秒除以60得到分钟

import time
seconds = time.time()
minutes = seconds / 60
print(minutes)

再次将其除以60,就可以得到小时


-3

division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes

PS我的代码不专业


2
嘿,这个问题要求使用hrs:min:sec的格式,而不是简单的除法
。– StupidWolf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.