在django应用程序中,我将向模板发送一个Entry对象列表。每个Entry对象都有一个开始时间和结束时间,即datetime.time值(从表单上的TimeFields开始)。在列出条目对象时,我需要显示每个条目的持续时间。在模型中放置一个持续时间字段似乎是减少sincE,开始和结束时间已经到了
模型

class Entry(models.Model):
    title = models.CharField(unique=True,max_length=50)
    starttime=models.TimeField(null=True)
    endtime=models.TimeField(null=True)
...

模板
{% for entry in object_list %}
<tr>
  <td> {{entry.title}} </td>
  <td> {{entry.starttime}}</td>
  <td> {{entry.endtime}}</td>
  <td> want to show duration here </td>
{%endfor %}

1.是否有任何筛选器可以获取两个datetime.time值并以秒为单位计算持续时间。
IE
given
 t1=datetime.time(2,30,50) and
 t2=datetime.time(3,00,50)
should show
30 minutes

2.此外,是否有一个过滤器,如果分钟值大于60,它可以以给定的分钟数显示持续时间(小时、分钟)
IE
if duration is 50 minutes ==> 50 minutes
if duration is 150 minutes ==> 2 hours,30 minutes

更新
def diff_in_time(start,end):
    startdelta=datetime.timedelta(hours=start.hour,minutes=start.minute,seconds=start.second)
    enddelta=datetime.timedelta(hours=end.hour,minutes=end.minute,seconds=end.second)
    return (enddelta-startdelta).seconds/60

当我尝试一些样本时间值时,它给出了预期的结果
#start 11:35:00 pm
#end   00:05:00 am
start= datetime.time(23,35,00)
end = datetime.time(00,05,00)
print diff_in_time(start,end)

==> 30 minutes

#start 00:35:00 am
#end   01:35:00 am
start= datetime.time(00,35,00)
end = datetime.time(01,35,00)
print diff_in_time(start,end)

==>60 minutes

最佳答案

我不知道问题出在哪里,除非结束时间比开始时间晚24小时。
假设开始时间是9:00:00,结束时间是13:00:00
如果这些时间是在8月15日、9:00:00和8月17日、13:00:00进行的,那么在不知道第15天和第17天的情况下,就没有必要试图获得它们之间的时间差。
因此,有两种情况:
开始时间和结束时间之间的间隔可能超过24小时,然后正如前面所说的,您必须使用datetime的对象
无论是开始时间和结束时间之间总是少于24小时,那么问题就很简单了。
=================
让我们检查一下第二个病例。
如果
开始时间11:30:00
结束时间..12点35分
显然,结束时间是开始后1小时5分钟
如果
开始时间11:30:00
结束时间..10点35分
结束不可能在同一个早晨开始之前,那么结束实际上是在第二天的早晨开始,也就是说24小时之后。
同样的道理也适用于下午开始,结束时间明显早于当天开始时间,下午或早上:结束时间实际上是在第二天,早上或下午,这取决于,但还是24小时后。
1)
所以,一个只需要时间属性的小函数就足以推导出时间差:

def difft(start,end):
    a,b,c,d = start.hour, start.minute, start.second, start.microsecond
    w,x,y,z = end.hour, end.minute, end.second, end.microsecond
    delt = (w-a)*60 + (x-b) + (y-c)/60. + (z-d)/60000000
    return delt + 1440 if delt<0 else delt

以下代码仅用于更好地显示结果:
从日期时间导入时间
def difft(start,end):
    a,b,c,d = start.hour, start.minute, start.second, start.microsecond
    w,x,y,z = end.hour, end.minute, end.second, end.microsecond
    delt = (w-a)*60 + (x-b) + (y-c)/60. + (z-d)/60000000

    D = '%sh %smn %ss %sms - %sh %smn %ss %sms == '
    ft = '%s + 1440 = %s  (1440 = 24x60mn)'
    return D % (w,x,y,z,a,b,c,d) +( ft % (delt, delt+1440) if delt<0 else str(delt))


print difft(time(11,30,0),time(12,35,0))
print difft(time(11,30,0),time(10,35,0))
print
print difft(time(20,40,0),time(22,41,0))
print difft(time(20,40,0),time(18,41,0))

结果
12h 35mn 0s 0ms - 11h 30mn 0s 0ms == 65.0
10h 35mn 0s 0ms - 11h 30mn 0s 0ms == -55.0 + 1440 = 1385.0  (1440 = 24x60mn)

22h 41mn 0s 0ms - 20h 40mn 0s 0ms == 121.0
18h 41mn 0s 0ms - 20h 40mn 0s 0ms == -119.0 + 1440 = 1321.0  (1440 = 24x60mn)

2)
要以更可读的格式获取持续时间:
def difft2(start,end):
    a,b,c,d = start.hour, start.minute, start.second, start.microsecond
    w,x,y,z = end.hour, end.minute, end.second, end.microsecond
    delt = (w-a)*60 + (x-b) + (y-c)/60. + (z-d)/60000000.
    if delt < 0:
        delt += 1440

    hh,rem = divmod(delt,60)
    hh = int(hh)
    mm = int(rem)
    rem = (rem - mm)*60
    ss = int(rem)
    ms = (rem - ss)*1000000
    ms = int(ms)

    SS = '%sh %smn %ss %sms - %sh %smn %ss %sms == %sh %smn %ss %sms'
    return SS % (w,x,y,z,a,b,c,d,hh,mm,ss,ms)



print difft2(time(11,30,0),time(12,35,45,478129))
print difft2(time(11,30,45,11),time(10,35,45,12))
print
print difft2(time(20,40,0),time(22,41,0))
print difft2(time(20,40,0),time(18,41,0))

结果
12h 35mn 45s 478129ms - 11h 30mn 0s 0ms == 1h 5mn 45s 478128ms
10h 35mn 45s 12ms - 11h 30mn 45s 11ms == 23h 5mn 0s 1ms

22h 41mn 0s 0ms - 20h 40mn 0s 0ms == 2h 1mn 0s 0ms
18h 41mn 0s 0ms - 20h 40mn 0s 0ms == 22h 1mn 0s 0ms

08-28 01:15
查看更多