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

Spe*_*cto 423 python

我有一个函数,可以在几秒钟内返回信息,但我需要以小时:分钟:秒存储该信息.

有没有一种简单的方法可以在Python中将秒转换为这种格式?

Sil*_*ost 666

你可以使用datetime.timedelta功能:

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
Run Code Online (Sandbox Code Playgroud)

  • 这可以工作多天:`str(datetime.timedelta(seconds = 60*60*24 + 1))`=`'1天,0:00:01'` (11认同)
  • 这是最好的方法,恕我直言,因为你可以在timedelta和任何日期时间对象上使用算术. (7认同)
  • `str(datetime.timedelta(seconds=round(666666.55)))` 正确呈现天数;抑制小数秒。 (7认同)
  • @FaiyazHaider **这不是正确的代码。** timedelta 字符串还将包含天数,然后显示“1 天,1:23:45”,**您的代码会将其更改为“01 天,1:23:45” `.** **至于 @cprn 的“溢出安全”警告,这一点也不奇怪**,对象并不意味着可以以这种方式减去。_它们表示两个时间戳之间的差异。_ **它们并不是为了比较四个时间戳之间的两个差异之间的差异(这就是您基本上正在做的事情)。** ;-) 阅读文档。 (2认同)

Bra*_*des 593

通过使用divmod()只有一个除法产生商和余数的函数,只需两个数学运算就可以非常快速地得到结果:

m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你可以把它延长到几天:`d,h = divmod(h,24)`. (13认同)
  • @MarkRansom:然后到几个月,m = d,divmod(m,31)`.哎呀,不,你不能.更糟糕的是,如果闰秒进入游戏,你的代码将会出错.长话短说:使用`timedelta`并且不要弄乱日历,它会咬你. (13认同)
  • @Tibo做'timedelta`处理闰秒?我怀疑不是.有很多应用程序,这种简单的数学运算绰绰有余. (4认同)
  • 如果您更喜欢运算符而不是函数,请使用模数; 例如(只有几分钟/秒):`'%d:%02dmn'%(秒/ 60,秒%60) (2认同)
  • 对于那些讨论日期时间的人:请注意,原始问题不希望将小时分解为任何更大的时间单位,因此任何创建比小时更大的时间单位的东西都需要手动将它们减少回整数小时。 (2认同)
  • @cprn - 我理解OP严格要求测量时间间隔的两种方法,在这种情况下,数字永远不会是负数。而且,我认识的大多数人都希望将 3600.0 秒称为“一小时”,无论该小时是否恰好跨越闰秒边界;OP必须为我们提供更多细节,才能知道问题是否真的与经过的时间有关,还是与“闰秒校正的时钟指针移动了多少?”有关,是的,这两者都是我们所希望的。但在后一种情况下,还需要提供开始时钟时间。 (2认同)

ana*_*nik 61

我很难说一个简单的方法(至少我不记得语法),但可以使用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'
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,这种方法从1开始测量天数,因此它不是为了表示时间增量而设计的,所以这是一个等待发生的事故.例如,使用`time.strftime('%d%H:%M:%S',time.gmtime(1))`=>'1天,0:00:01'. (12认同)

mar*_*ell 34

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

和:

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

没有':0> 8':

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

和:

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

但:

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

  • 对其他人:`without ':0>8':` 示例缺少一个前导 0。`{:0>8}` 零向左填充 8 个零。 (2认同)
  • 在python 3.5.2中,我得到一个TypeError.我正在格式化`time.time() - start`变量.任何见解?`TypeError:传递给object .__ format__`的非空格式字符串 (2认同)

小智 17

这是我的快速诀窍:

from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
Run Code Online (Sandbox Code Playgroud)

访问:https: //humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan 获取更多信息.

  • 你不知道我寻找这个答案花了多长时间。太感谢了。我希望我能给你的不仅仅是+1。 (2认同)

Tom*_*dla 15

有点偏离主题的答案,但可能对某人有用

def time_format(seconds: int) -> str:
    if seconds is not None:
        seconds = int(seconds)
        d = seconds // (3600 * 24)
        h = seconds // 3600 % 24
        m = seconds % 3600 // 60
        s = seconds % 3600 % 60
        if d > 0:
            return '{:02d}D {:02d}H {:02d}m {:02d}s'.format(d, h, m, s)
        elif h > 0:
            return '{:02d}H {:02d}m {:02d}s'.format(h, m, s)
        elif m > 0:
            return '{:02d}m {:02d}s'.format(m, s)
        elif s > 0:
            return '{:02d}s'.format(s)
    return '-'
Run Code Online (Sandbox Code Playgroud)

结果是:

print(time_format(25*60*60 + 125)) 
>>> 01D 01H 02m 05s
print(time_format(17*60*60 + 35)) 
>>> 17H 00m 35s
print(time_format(3500)) 
>>> 58m 20s
print(time_format(21)) 
>>> 21s
Run Code Online (Sandbox Code Playgroud)


小智 13

以下套装对我有用。

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


Mar*_*oft 9

如果你需要获得datetime.time价值,你可以使用这个技巧:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
Run Code Online (Sandbox Code Playgroud)

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

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

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
Run Code Online (Sandbox Code Playgroud)

而不是1你可以使用任何大于0的数字.这里我们使用的事实datetime.fromordinal总是返回组件为零的datetime对象time.


Sam*_*Sam 6

小时 (h) 由楼层除法(按 //)秒除以 3600(60 分钟/小时 * 60 秒/分钟)计算得出

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

类似地,秒(s)按小时和分钟计算的剩余时间。

休息只是字符串格式!

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


Lee*_*Lee 5

这就是我的方法。

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

一些例子:

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


tee*_*rna 5

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

印刷

40.0
01:30:40
Run Code Online (Sandbox Code Playgroud)