0

我正在尝试编写一个基本的提醒应用程序,用户可以在其中输入重要日期(生日、纪念日等),并查看距离该日期的下一个周年纪念日还有多少时间。例如,一个用户的生日可能是 1990 年 1 月 1 日,我想为他们显示直到他们下一个生日的时间(2 个月 14 天)。

我一直在使用 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() 模块没有属性“now”时引发错误,这是查找当前日期的旧方法吗?)

提前致谢!

4

2 回答 2

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)

event_date正如 Christian Ternus 指出的那样,如果是闰日,那将行不通。您可以禁止闰日作为event_date值,要求用户输入 2 月 28 日或 3 月 1 日。或者您可以捕获由ValueError引发的异常replace并进行更正,添加或减去一天timedelta。如果您想显示真实的时间间隔,或者用于calendar.isleap计算下一个闰年。

于 2013-10-18T01:26:58.673 回答
0

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

于 2013-10-18T01:27:54.980 回答