Je travaille sur une application de type calendrier Groovy / Java permettant à l'utilisateur de saisir des événements avec une date de début et une récurrence facultative. Si c'est un événement récurrent, il peut récupérer:
J'ai initialement planifié lors de l'utilisation de l'API de Google Calendar pour faire toute la logique de récurrence, mais elle s'est révélée être un énorme pita, pour des raisons, je vais discuter davantage si quelqu'un se soucie. P>
Alors maintenant, j'ai décidé de rouler ma propre solution. Compte tenu d'une date, je tiens à déterminer si un événement récurrent survient à cette date. Ma logique (en pseudocode) sera la suivante: P>
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 } }
3 Réponses :
Je ne sais rien de Groovy et ma première suggestion allait être Joda, mais vous savez à ce sujet.
Je sais que cela peut sembler trop cher, et peut-être même pas applicable, mais Le planificateur de quartz gère toutes ces règles de récurrence et d'événements. Vous ne pouvez pas utiliser ses capacités de planification et utiliser simplement les classes de déclenchement (comme Crontrigger a>) Pour calculer les dates d'événements pour vous. P> Le lien Crontrigger ci-dessus montre quelques exemples d'expressions que vous pouvez utiliser pour gérer vos événements, comme cette situation particulièrement méchante: P> "0 0 12 L *?" - déclencher un événement au milieu de la journée tous les derniers jours du mois (pas de maux de tête avec des années saut et telles) p>
blockQuote> Les problèmes de temps d'été de la lumière du jour sont également gérés. p> comme pour le code, créez la gâchette avec la récurrence souhaitée, puis vous pouvez extraire tous les temps de tir que vous souhaitez: P > espère que cela peut être utile. p> p>
Si vous avez des informations plus spécifiques sur la façon dont je peux utiliser Joda / Quartz pour atteindre mon objectif, j'aimerais l'entendre.
Le type de règles de récurrence que vous souhaitez est raisonnablement bien spécifié dans RFC-2445 (fondamentalement, la spécification ICAL). Obtenir la minutie de ce correct peut être assez impliqué. Je suggérerais d'utiliser le bibliothèque Google-RFC-2445 pour cela, ou une autre implémentation de celle-ci. Spec comme iCAL4J . P>
Je ne suis pas très familier avec la bibliothèque Groovy, mais depuis que Groovy est en cours d'exécution sur JVM, nous supposons que vous devriez également utiliser la bibliothèque Java / Scala.
Ce dont vous avez besoin ici est une bibliothèque de génération de planification professionnelle comme Lamma ( http://lamma.io ) au lieu d'une bibliothèque de temps de date générale comme Joda. p>
Question similaire: Quel est le meilleur calculateur de modèle de récurrence de la date de java
Ce document Martin Fowler, événements récurrents pour les calendriers pourrait être utile.