логика повторяющегося события

Я работаю над приложением типа календаря Groovy/Java, которое позволяет пользователю вводить события с датой начала и дополнительным повторением. Если это - повторяющееся событие, это может повторно ворковать:

  • ежемесячно в дату месяца, который соответствует дате начала
  • еженедельно в день недели этого соответствует дате начала
  • каждые 2 недели в день недели этого соответствует дате начала
  • и т.д.

Я первоначально запланировал использование API Google Календаря, чтобы сделать всю логику повторения, но это оказалось огромным ЛАВАШЕМ по причинам, которые я буду обсуждать далее, если кто-либо будет заботиться.

Таким образом, теперь я решил прокрутить свое собственное решение. Учитывая дату, я хочу выяснить, имеет ли повторяющееся событие место в эту дату. Моя логика (в псевдокоде) будет следующие:

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
  }  
}

Эта логика кажется разумной, но на самом деле будет довольно большим усилием реализовать, когда Вы рассматриваете все странные пограничные случаи (например, как обработать ежемесячное повторяющееся событие в феврале, первое вхождение которого является Jan 31).

Существует ли библиотека, которая может взять, помогают мне реализовать это? Некоторые специфические особенности очень ценились бы (например, никакой кредит не будет назначен за "Использование Временем Joda").

Спасибо, Дон

12
задан Dónal 20 October 2010 в 11:58
поделиться