【问题标题】:Django - how to handle time durationDjango - 如何处理持续时间
【发布时间】:2020-02-17 21:25:52
【问题描述】:

我正在尝试显示比赛中经过的时间。

class results(models.Model):
    race_id = models.ForeignKey(Race, on_delete=models.CASCADE)
    runner_id = models.ForeignKey(Runner, on_delete=models.CASCADE)
    race_start = models.DateTimeField()
    race_finish = models.DateTimeField(blank=True, null=True)
    obs = models.TextField(blank=True)
    def __str__(self):
        return self.race_id.race_cod+" - "+self.runner_id.name
    class Meta:
        verbose_name_plural = "Results"

在这里我找到了以下指南:

Django model elapsed time between two DateTimeFields

Django: What's the best field type to represent time elapsed?

不幸的是,那里提出的解决方案似乎有点复杂。

我还在.html 查看页面中找到了这个解决方法

<div class="info-box-content">
  <span class="info-box-number">Time - {{ results.race_finish|timesince:results.race_start }}</span>
</div>

这个问题是超过 24 小时的所有内容都是 x 天,yy 小时 - 而我需要将持续时间显示为 HH:mm

这里有什么提示吗?

【问题讨论】:

    标签: django time duration elapsed


    【解决方案1】:

    为此,我建议添加自定义模板过滤器或新模型属性。例如,如果您想将其添加到您的模型中:

    class results(models.Model):
        ...
        race_start = models.DateTimeField()
        race_finish = models.DateTimeField(blank=True, null=True)
        @property
        def duration(self):
            if not (self.race_start and self.race_finish): return None
            a,b=self.race_start, self.race_finish
            return '%s:%s' % ((b-a).days*24 + (b-a).seconds//3600, (b-a).seconds%3600//60)
    

    这是一个将其转换为类(在 django 之外)的示例,以展示它如何处理相隔 1 天 2 小时 17 分钟的两个比赛时间:

    import datetime
    class results:
        def __init__(self):
            self.race_start = datetime.datetime.now()
            self.race_finish = datetime.datetime.now() + datetime.timedelta(days=1, hours=2, minutes=17)
        @property
        def duration(self):
            if not (self.race_start and self.race_finish): return None
            a,b=self.race_start, self.race_finish
            return '%s:%s' % ((b-a).days*24 + (b-a).seconds//3600, (b-a).seconds%3600//60)
    
    >>> r=results()
    >>> r.duration
    '26:17'
    

    换句话说,在您的模板中,您可以只使用Time - {{ results.duration }},它应该显示:“Time - 26:17”。

    【讨论】:

    • 优秀的解决方案。奇迹般有效。谢谢。
    【解决方案2】:

    您是否尝试过使用内置标签?

    {{ value|time:"H:i" }}
    

    https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#time

    【讨论】:

    • 我试过了,它不适用于“timesince”,但是谢谢
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 2018-08-02
    • 2017-04-21
    • 2010-11-27
    • 2021-01-30
    • 1970-01-01
    • 2020-06-10
    • 2011-10-15
    相关资源
    最近更新 更多