2013-10-18 24 views
0

我想写一个基本的提醒应用程序,用户可以输入重要的日期(生日,纪念日等),看看有多少时间,直到该日期的下个周年纪念日。例如,用户可以像1990年1月1日那样生日,我想为他们显示直到他们下一个生日的时间(2个月14天)。保存旧的日期和显示时间,直到在Django的那个日期的下一个周年纪念

我一直使用内置模板标签的django timeuntil,但它只适用于将来的日期(如果日期在当前日期之前,它不会显示任何内容)。我不知道如何去将所输入的日期“正常化”为将来的某个时间。

当前代码:

def events(request): 
    relationships = Relationship.objects.filter(user=request.user) 
    events = Event.objects.filter(user=request.user).order_by('date')[:8] 
    event_date = events[0].date 

    if datetime.now() >= event_date: 
     difference = datetime.now() - event_date 
     event_date_new = event_date + difference 
     event_date = event_date_new 
    context = { 
     'relationships': relationships, 
     'events': events 
     } 
    return render(request, 'app/events.html', context)  

模板

<td class="column-right"><h4>{{event.date|timeuntil}}</h4></td> 

(这也有助我们datetime.now()的错误模块没有属性 “现在”,是一个古老的方式找到当前日期?)

在此先感谢!

回答

0

nowdatetime.datetime类的方法,而不是datetime模块:

difference = datetime.datetime.now() - event_date 

也就是说,你的校正逻辑处于关闭状态。如果你在一行中写出来的计算,应该清楚为什么:

通过置换
difference = datetime.now() - event_date 
event_date_new = event_date + difference 

所以:

event_date_new = event_date + (datetime.now() - event_date) 

这简化为:

event_date_new = datetime.now() 

我会尝试一下这个方法:

now = datetime.datetime.now() 
event_date = event_date.replace(year=now.year) 
if event_date < now: 
    event_date.replace(year=now.year + 1) 

由于基督教Ternus指出,如果event_date是一个闰日,这将无法正常工作。您可能不允许闰日为event_date值,要求用户输入2月28日或3月1日。或者你可以捕获replace引发的ValueError异常,并进行修正,增加或减少一天的timedelta。或者使用calendar.isleap找出下一个闰年,如果你想显示真正的时间间隔。

+0

2月29日会发生什么? –

+0

@ChristianTernus - 一个公平的点,但我认为OP必须做出决定。 'replace'只在'event_date'上被调用,而不是当前日期,所以可以在入口或计算中检查特殊情况。我不确定到2012年2月29日的下周年应该是什么时间。 –

+0

当处理日期偏移量时,最好使用像'dateutil.relativedelta'这样的处理2月29日之类的案例。 –

0

datetime是一个标准的Python模块,在这个模块下有一个对象具有相同的名称。 nowdatetime对象的类方法。所以如果你想使用datetime.now()你应该from datetime import datetime或致电datetime.datetime.now()

相关问题