【发布时间】:2010-10-20 11:58:15
【问题描述】:
我正在开发一个 Groovy/Java 日历类型的应用程序,该应用程序允许用户输入带有开始日期和可选重复周期的事件。如果是经常性事件,它可能会再次发生:
- 每月在与开始日期对应的月份的某个日期
- 每周在与开始日期相对应的一周中的某一天
- 每 2 周对应开始日期的一周中的某一天
- 等
我最初计划使用 Google 日历 API 来执行所有重复逻辑,但事实证明它是一个巨大的 PITA,如果有人关心,我会进一步讨论原因。
所以现在,我决定推出自己的解决方案。给定一个日期,我想知道在这个日期是否发生了重复性事件。我的逻辑(伪代码)如下:
public boolean occursOnDate(def date, def event) {
def firstDate = event.startDate
if (firstDate > date) {
return false;
} else if (event.isWeekly()) {
return event.dayOfWeek() == date.dayOfWeek()
} else if (event.isMonthly()) {
return event.dayOfMonth() == date.dayOfMonth()
} else {
// At this point we know the event occurs every X weeks where X > 1
// Increment firstDate by adding X weeks to it as many times as possible, without
// going past date
return firstDate == date
}
}
这个逻辑看起来很合理,但当您考虑到所有奇怪的边缘情况(例如,如何处理 2 月第一次发生在 1 月 31 日的每月重复事件)时,实际上会付出相当多的努力来实现。
有没有图书馆可以帮助我实现这个?一些细节将不胜感激(例如,“使用 Joda 时间”不会获得积分)。
谢谢, 唐
【问题讨论】:
-
这篇 Martin Fowler 论文,Recurring Events for Calendars 可能有用。