Django - 如何处理持续时间
Django - how to handle time duration
我想在比赛中显示经过的时间。
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: 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
这里有什么提示吗?
为此,我建议添加自定义模板过滤器或新模型 属性。例如,如果你想将它添加到你的模型中:
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)
这是一个将它转换为 class(在 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
”。
您尝试过使用内置标签吗?
{{ value|time:"H:i" }}
https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#time
我想在比赛中显示经过的时间。
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: 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
这里有什么提示吗?
为此,我建议添加自定义模板过滤器或新模型 属性。例如,如果你想将它添加到你的模型中:
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)
这是一个将它转换为 class(在 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
”。
您尝试过使用内置标签吗?
{{ value|time:"H:i" }}
https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#time