jim*_*ner 7 python django filter
在django应用程序中,我向Entry模板发送一个对象列表.每个Entry对象都有一个开始,结束时间是datetime.time值(来自TimeFields表单).在列出Entry对象时,我需要显示持续时间每个条目.在模型中输入一个持续时间字段似乎是简化的,因为开始和结束时间已经存在
模型
class Entry(models.Model):
title = models.CharField(unique=True,max_length=50)
starttime=models.TimeField(null=True)
endtime=models.TimeField(null=True)
...
Run Code Online (Sandbox Code Playgroud)
模板
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
1.是否有任何过滤器可以采用两个datetime.time值并以秒为单位计算持续时间.即
given
t1=datetime.time(2,30,50) and
t2=datetime.time(3,00,50)
should show
30 minutes
Run Code Online (Sandbox Code Playgroud)
2.此外,是否有过滤器,如果分钟值大于60,则可以在给定的分钟数中显示持续时间,以小时,分钟为单位
即
if duration is 50 minutes ==> 50 minutes
if duration is 150 minutes ==> 2 hours,30 minutes
Run Code Online (Sandbox Code Playgroud)
更新
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
Run Code Online (Sandbox Code Playgroud)
当我尝试一些采样时间值时,它给了我预期的结果
#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
Run Code Online (Sandbox Code Playgroud)
你有一个问题.你不能 - 也不应该 - 比较两次.是凌晨1点或凌晨1点之后?这取决于他们是否在同一天.
您需要将它们存储为datetime代表相对绝对时间的其他内容,或者您需要将它们变为datetime如下所示:
def todatetime(time):
return datetime.datetime.today().replace(hour=time.hour, minute=time.minute, second=time.second,
microsecond=time.microsecond, tzinfo=time.tzinfo)
def timestodelta(starttime, endtime):
return todatetime(endtime) - todatetime(starttime)
Run Code Online (Sandbox Code Playgroud)
如果两次调用today跨越午夜,这将无法给出预期的答案.
然后你应该将这个应用程序用于一个DurationField,它存储一个timedelta结果,将结果存储在数据库中以便于显示.
我不知道问题出在哪里,除非结束时间晚于开始时间 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:00
结束时间显然是开始后1 小时 5 分钟
如果
开始时间 11:30:00
结束时间.. 10:35:00
结束时间不能在当天早上开始之前,那么结束时间实际上是在当天之后的第二天早上这是开始,也就是说24小时后。
当开始时间是下午并且结束时间明显早于当天的开始时间、下午或早上时,同样的推理也适用:结束时间实际上是第二天、早上或下午,这取决于情况,但它是还是24小时后。
所以一个小函数,只需要时间的属性就足以扣除时间差:
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
Run Code Online (Sandbox Code Playgroud)
以下代码只是为了更好的显示结果:
从日期时间导入时间
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))
Run Code Online (Sandbox Code Playgroud)
结果
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)
Run Code Online (Sandbox Code Playgroud)
要以更易读的格式获取持续时间:
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))
Run Code Online (Sandbox Code Playgroud)
结果
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9212 次 |
| 最近记录: |