Я работаю над приложением Groovy/Java calendar-type, которое позволяет пользователю вводить события с датой начала и необязательным повторением. Если это повторяющееся событие, оно может повторяться:
- ежемесячно в день месяца, который соответствует дате начала.
- еженедельно в день недели, соответствующем дате начала.
- каждые 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 января).
Есть ли библиотека, которая может помочь мне реализовать это? Некоторые особенности будут высоко оценены (например, ни один кредит не будет присуждаться за "Использовать время Джоды" ).
Спасибо, Дон