【问题标题】:How can I format timedelta for display如何格式化 timedelta 以进行显示
【发布时间】:2018-12-04 03:30:52
【问题描述】:

我的脚本计算 2 次的差异。像这样:

lasted = datetime.strptime(previous_time, FMT) - datetime.strptime(current_time, FMT)

它返回一个 timedelta 对象。目前,它给了我几秒钟的差异。

我怎样才能格式化它以很好地显示?

例如将“121”转换为“00:02:01”?

谢谢。

【问题讨论】:

  • 你有某种datetime 插件吗?我的datetime 没有这个功能。但是,我想datetime.strftime() 可能存在并且是您问题的明确答案。

标签: python


【解决方案1】:

您是否尝试过使用str()

>>> a = datetime.now()                 
>>> b = datetime.now() - a
>>> b
datetime.timedelta(0, 6, 793600)
>>> str(b)
'0:00:06.793600'

或者,您可以使用字符串格式:

>>> a = datetime.now()                 
>>> b = datetime.now() - a
>>> s = b.total_seconds()
>>> '{:02}:{:02}:{:02}'.format(s // 3600, s % 3600 // 60, s % 60)
'00:00:06'

【讨论】:

  • 它可以工作,但格式不是很好。应该有一种方法可以像 datetime 一样在本地执行此操作。
【解决方案2】:

您可以在使用str 时通过创建一个新的 timedelta 对象来截断秒数

>>> a = datetime.now()
>>> b = datetime.now()
>>> c = b-a
>>> str(c)
'0:00:10.327705'
>>> str(timedelta(seconds=c.seconds))
'0:00:10'

【讨论】:

    【解决方案3】:

    [在此处插入无耻的自我宣传声明]

    您可以使用https://github.com/frnhr/django_timedeltatemplatefilter

    它被打包为 Django 的模板过滤器,所以这里是重要的部分,只是普通的 Python:

    def format_timedelta(value, time_format="{days} days, {hours2}:{minutes2}:{seconds2}"):
    
        if hasattr(value, 'seconds'):
            seconds = value.seconds + value.days * 24 * 3600
        else:
            seconds = int(value)
    
        seconds_total = seconds
    
        minutes = int(floor(seconds / 60))
        minutes_total = minutes
        seconds -= minutes * 60
    
        hours = int(floor(minutes / 60))
        hours_total = hours
        minutes -= hours * 60
    
        days = int(floor(hours / 24))
        days_total = days
        hours -= days * 24
    
        years = int(floor(days / 365))
        years_total = years
        days -= years * 365
    
        return time_format.format(**{
            'seconds': seconds,
            'seconds2': str(seconds).zfill(2),
            'minutes': minutes,
            'minutes2': str(minutes).zfill(2),
            'hours': hours,
            'hours2': str(hours).zfill(2),
            'days': days,
            'years': years,
            'seconds_total': seconds_total,
            'minutes_total': minutes_total,
            'hours_total': hours_total,
            'days_total': days_total,
            'years_total': years_total,
        })
    

    没有比这更简单的了 :) 不过,请查看自述文件以获取一些示例。

    你的例子:

    >>> format_timedelta(lasted, '{hours_total}:{minutes2}:{seconds2}')
    0:02:01
    

    【讨论】:

      【解决方案4】:

      时间增量有时不需要小数秒位。 通过拆分和丢弃快速截断该小数位:

      a = datetime.now()
      b = datetime.now() - a
      

      然后

      str(b).split('.')[0]
      

      (假设几分之一秒与您无关的应用程序)

      【讨论】:

        【解决方案5】:

        希望这能解决您的问题,

        import datetime
        start = datetime.datetime(2012,11,16,11,02,59)
        end = datetime.datetime(2012,11,20,16,22,53)
        delta = end-start
        print ':'.join(str(delta).split(':')[:3])
        
        In [29]: import datetime
        In [30]: start = datetime.datetime(2012,11,16,11,02,59)
        In [31]: end = datetime.datetime(2012,11,20,16,22,53)
        In [32]: delta = end-start
        In [33]: print ':'.join(str(delta).split(':')[:3])
        4 days, 5:19:54
        

        【讨论】:

          【解决方案6】:

          扩展@blender 的答案。如果您对毫秒分辨率感兴趣

          a = datetime.now()
          b = datetime.now() - a
          s = b.seconds
          ms = int(b.microseconds / 1000)
          '{:02}:{:02}:{:02}.{:03}'.format(s // 3600, s % 3600 // 60, s % 60, ms)
          

          【讨论】:

            猜你喜欢
            • 2022-01-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            • 1970-01-01
            • 2012-05-12
            相关资源
            最近更新 更多