我正在开发一个 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 日),实际上需要付出很多努力才能实现。
是否有图书馆可以帮我实现这个?一些细节将不胜感激(例如,“Use Joda Time”将不会获得学分)。
谢谢, 唐
最佳答案
您想要的那种重复规则在 RFC-2445(基本上是 iCal 规范)中有相当详细的规定。获得这个正确的细节可能非常复杂。我建议使用 google-rfc-2445这个库,或该规范的另一个实现,如 iCal4J .
关于java - 重复事件逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977508/