логика повторяющихся событий
Я работаю над приложением типа календаря Groovy / Java, которое позволяет пользователю вводить события с начальной датой и необязательным повторением. Если это повторяющееся событие, оно может повторяться:
ежемесячно в день месяца, который соответствует дате началаеженедельно в день недели, соответствующий дате началакаждые 2 недели в день недели, соответствующий дате началаи т.п.Изначально я планировал использовать API календаря Google для выполнения всей логики повторения, но это оказалось огромным 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
}
}
Эта логика кажется разумной, но на самом деле будет достаточно много усилий для реализации, когда вы рассмотрите все странные крайние случаи (например, как обработать ежемесячное повторяющееся событие в феврале, первое появление которого - 31 января).
Есть ли библиотека, которая может помочь мне реализовать это? Некоторые детали будут высоко оценены (например, за «Использование времени Joda» не будет присуждаться кредит).
Спасибо дон