我正在使用Groovy/Java日历类型的应用程序,该应用程序允许用户输入具有开始日期和可选重复发生的事件。如果是重复发生的事件,则可能会再次发生:
每月
每周的某天的
我最初计划使用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时间”将不会获得任何积分)。
谢谢,
大学教师
最佳答案
RFC-2445(基本上是iCal规范)中合理地指定了所需的重复规则类型。弄清楚这个正确的细节可能会涉及很多。我建议为此使用google-rfc-2445库,或者该规范的另一种实现,例如iCal4J。