Estoy trabajando en una aplicación de tipo calendario Groovy/Java que permite al usuario introducir eventos con una fecha de inicio y una repetición opcional. Si se trata de un evento recurrente, que pueden repetirse:lógica evento recurrente
- mensual de una fecha del mes que corresponda a la fecha de inicio
- semanal en un día de la semana de la que corresponde a la fecha de inicio
- cada 2 semanas en un día de la semana de la que corresponde a la fecha de inicio
- etc.
que originalmente había planeado el uso de la API de Google Calendar para hacer toda la lógica de la repetición, pero resultó ser un enorme PITA , por razones Discutiré más si a alguien le importa.
Así que ahora, he decidido rodar mi propia solución. Dada una fecha, quiero averiguar si un evento recurrente ocurre en esta fecha. Mi lógica (en pseudocódigo) será la siguiente:
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
}
}
Esta lógica parece razonable, pero en realidad será un buen montón de esfuerzo para poner en práctica si tenemos en cuenta todos los casos extremos extraño (por ejemplo, cómo manejar una mensual recurrente evento en febrero cuya primera aparición es el 31 de enero).
¿Hay una biblioteca que puede tomar me ayude a poner en práctica esto? Algunos detalles serían muy apreciados (por ejemplo, no se otorgará crédito por "Usar tiempo Joda").
Gracias, Don
Pregunta similar: [¿Cuál es el mejor patrón de recurrencia calculadora de la fecha java] (http://stackoverflow.com/q/492055/642706) –
Este documento Martin Fowler, [eventos periódicos para calendarios] (http://martinfowler.com/apsupp/recurring.pdf) podría ser útil. –