Format timedelta to string

后端 未结 28 1743
春和景丽
春和景丽 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:23

    timedelta to string, use for print running time info.

    def strf_runningtime(tdelta, round_period='second'):
      """timedelta to string,  use for measure running time
      attend period from days downto smaller period, round to minimum period
      omit zero value period  
      """
      period_names = ('day', 'hour', 'minute', 'second', 'millisecond')
      if round_period not in period_names:
        raise Exception(f'round_period "{round_period}" invalid, should be one of {",".join(period_names)}')
      period_seconds = (86400, 3600, 60, 1, 1/pow(10,3))
      period_desc = ('days', 'hours', 'mins', 'secs', 'msecs')
      round_i = period_names.index(round_period)
      
      s = ''
      remainder = tdelta.total_seconds()
      for i in range(len(period_names)):
        q, remainder = divmod(remainder, period_seconds[i])
        if int(q)>0:
          if not len(s)==0:
            s += ' '
          s += f'{q:.0f} {period_desc[i]}'
        if i==round_i:
          break
        if i==round_i+1:
          s += f'{remainder} {period_desc[round_i]}'
          break
        
      return s
    

    e.g. auto omit zero leading period:

    >>> td = timedelta(days=0, hours=2, minutes=5, seconds=8, microseconds=3549)
    >>> strfdelta_round(td, 'second')
    '2 hours 5 mins 8 secs'
    

    or omit middle zero period:

    >>> td = timedelta(days=2, hours=0, minutes=5, seconds=8, microseconds=3549)
    >>> strfdelta_round(td, 'millisecond')
    '2 days 5 mins 8 secs 3 msecs'
    

    or round to minutes, omit below minutes:

    >>> td = timedelta(days=1, hours=2, minutes=5, seconds=8, microseconds=3549)
    >>> strfdelta_round(td, 'minute')
    '1 days 2 hours 5 mins'
    

提交回复
热议问题