How do I convert seconds to hours, minutes and seconds?

前端 未结 12 2109
执笔经年
执笔经年 2020-11-22 11:00

I have a function that returns information in seconds, but I need to store that information in hours:minutes:seconds.

Is there an easy way to convert the seconds to

相关标签:
12条回答
  • 2020-11-22 11:25

    This is my quick trick:

    from humanfriendly import format_timespan
    secondsPassed = 1302
    format_timespan(secondsPassed)
    # '21 minutes and 42 seconds'
    

    For more info Visit: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan

    0 讨论(0)
  • 2020-11-22 11:26

    If you need to get datetime.time value, you can use this trick:

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

    You cannot add timedelta to time, but can add it to datetime.

    UPD: Yet another variation of the same technique:

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

    Instead of 1 you can use any number greater than 0. Here we use the fact that datetime.fromordinal will always return datetime object with time component being zero.

    0 讨论(0)
  • 2020-11-22 11:26

    The following set worked for me.

    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']
    
    0 讨论(0)
  • 2020-11-22 11:27

    This is how I got it.

    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)
    

    Some examples:

    $ 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']
    
    0 讨论(0)
  • dateutil.relativedelta is convenient if you need to access hours, minutes and seconds as floats as well. datetime.timedelta does not provide a similar interface.

    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)))
    

    Prints

    40.0
    01:30:40
    
    0 讨论(0)
  • 2020-11-22 11:34

    hours (h) calculated by floor division (by //) of seconds by 3600 (60 min/hr * 60 sec/min)

    minutes (m) calculated by floor division of remaining seconds (remainder from hour calculation, by %) by 60 (60 sec/min)

    similarly, seconds (s) by remainder of hour and minutes calculation.

    Rest is just string formatting!

    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
    
    0 讨论(0)
提交回复
热议问题