Format timedelta to string

后端 未结 28 1693
春和景丽
春和景丽 2020-11-22 03:57

I\'m having trouble formatting a datetime.timedelta object.

Here\'s what I\'m trying to do: I have a list of objects and one of the members of the cl

相关标签:
28条回答
  • 2020-11-22 04:13
    import datetime
    hours = datetime.timedelta(hours=16, minutes=30)
    print((datetime.datetime(1,1,1) + hours).strftime('%H:%M'))
    
    0 讨论(0)
  • 2020-11-22 04:13
    t1 = datetime.datetime.strptime(StartTime, "%H:%M:%S %d-%m-%y")
    
    t2 = datetime.datetime.strptime(EndTime, "%H:%M:%S %d-%m-%y")
    
    return str(t2-t1)
    

    So for:

    StartTime = '15:28:53 21-07-13'
    EndTime = '15:32:40 21-07-13'
    

    returns:

    '0:03:47'
    
    0 讨论(0)
  • 2020-11-22 04:19

    Please check this function - it converts timedelta object into string 'HH:MM:SS'

    def format_timedelta(td):
        hours, remainder = divmod(td.total_seconds(), 3600)
        minutes, seconds = divmod(remainder, 60)
        hours, minutes, seconds = int(hours), int(minutes), int(seconds)
        if hours < 10:
            hours = '0%s' % int(hours)
        if minutes < 10:
            minutes = '0%s' % minutes
        if seconds < 10:
            seconds = '0%s' % seconds
        return '%s:%s:%s' % (hours, minutes, seconds)
    
    0 讨论(0)
  • 2020-11-22 04:23

    I personally use the humanize library for this:

    >>> import datetime
    >>> humanize.naturalday(datetime.datetime.now())
    'today'
    >>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
    'yesterday'
    >>> humanize.naturalday(datetime.date(2007, 6, 5))
    'Jun 05'
    >>> humanize.naturaldate(datetime.date(2007, 6, 5))
    'Jun 05 2007'
    >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
    'a second ago'
    >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
    'an hour ago'
    

    Of course, it doesn't give you exactly the answer you were looking for (which is, indeed, str(timeA - timeB), but I have found that once you go beyond a few hours, the display becomes quickly unreadable. humanize has support for much larger values that are human-readable, and is also well localized.

    It's inspired by Django's contrib.humanize module, apparently, so since you are using Django, you should probably use that.

    0 讨论(0)
  • 2020-11-22 04:23

    Here is a general purpose function for converting either a timedelta object or a regular number (in the form of seconds or minutes, etc.) to a nicely formatted string. I took mpounsett's fantastic answer on a duplicate question, made it a bit more flexible, improved readibility, and added documentation.

    You will find that it is the most flexible answer here so far since it allows you to:

    1. Customize the string format on the fly instead of it being hard-coded.
    2. Leave out certain time intervals without a problem (see examples below).

    Function:

    from string import Formatter
    from datetime import timedelta
    
    def strfdelta(tdelta, fmt='{D:02}d {H:02}h {M:02}m {S:02}s', inputtype='timedelta'):
        """Convert a datetime.timedelta object or a regular number to a custom-
        formatted string, just like the stftime() method does for datetime.datetime
        objects.
    
        The fmt argument allows custom formatting to be specified.  Fields can 
        include seconds, minutes, hours, days, and weeks.  Each field is optional.
    
        Some examples:
            '{D:02}d {H:02}h {M:02}m {S:02}s' --> '05d 08h 04m 02s' (default)
            '{W}w {D}d {H}:{M:02}:{S:02}'     --> '4w 5d 8:04:02'
            '{D:2}d {H:2}:{M:02}:{S:02}'      --> ' 5d  8:04:02'
            '{H}h {S}s'                       --> '72h 800s'
    
        The inputtype argument allows tdelta to be a regular number instead of the  
        default, which is a datetime.timedelta object.  Valid inputtype strings: 
            's', 'seconds', 
            'm', 'minutes', 
            'h', 'hours', 
            'd', 'days', 
            'w', 'weeks'
        """
    
        # Convert tdelta to integer seconds.
        if inputtype == 'timedelta':
            remainder = int(tdelta.total_seconds())
        elif inputtype in ['s', 'seconds']:
            remainder = int(tdelta)
        elif inputtype in ['m', 'minutes']:
            remainder = int(tdelta)*60
        elif inputtype in ['h', 'hours']:
            remainder = int(tdelta)*3600
        elif inputtype in ['d', 'days']:
            remainder = int(tdelta)*86400
        elif inputtype in ['w', 'weeks']:
            remainder = int(tdelta)*604800
    
        f = Formatter()
        desired_fields = [field_tuple[1] for field_tuple in f.parse(fmt)]
        possible_fields = ('W', 'D', 'H', 'M', 'S')
        constants = {'W': 604800, 'D': 86400, 'H': 3600, 'M': 60, 'S': 1}
        values = {}
        for field in possible_fields:
            if field in desired_fields and field in constants:
                values[field], remainder = divmod(remainder, constants[field])
        return f.format(fmt, **values)
    

    Demo:

    >>> td = timedelta(days=2, hours=3, minutes=5, seconds=8, microseconds=340)
    
    >>> print strfdelta(td)
    02d 03h 05m 08s
    
    >>> print strfdelta(td, '{D}d {H}:{M:02}:{S:02}')
    2d 3:05:08
    
    >>> print strfdelta(td, '{D:2}d {H:2}:{M:02}:{S:02}')
     2d  3:05:08
    
    >>> print strfdelta(td, '{H}h {S}s')
    51h 308s
    
    >>> print strfdelta(12304, inputtype='s')
    00d 03h 25m 04s
    
    >>> print strfdelta(620, '{H}:{M:02}', 'm')
    10:20
    
    >>> print strfdelta(49, '{D}d {H}h', 'h')
    2d 1h
    
    0 讨论(0)
  • 2020-11-22 04:23

    I know that this is an old answered question, but I use datetime.utcfromtimestamp() for this. It takes the number of seconds and returns a datetime that can be formatted like any other datetime.

    duration = datetime.utcfromtimestamp(end - begin)
    print duration.strftime('%H:%M')
    

    As long as you stay in the legal ranges for the time parts this should work, i.e. it doesn't return 1234:35 as hours are <= 23.

    0 讨论(0)
提交回复
热议问题