[ALGO] Déterminer une date d'affichage
Hello,
Je me retrouve confronté à un problème de dates et je ne sais pas par ou commencer mon analyse.
J'aimerais afficher un message à mes utilisateurs en prenant en compte leurs préférences.
Ces préférences sont des périodes d'autorisations et/ou de refus.
Exclusion 1: 6 à 8h
Exclusion 2: 10 à 13h
Exclusion 3: 9 à 11h
Exclusion 4: 12 à 14h
Inclusion 1: 8h30 à 10h
Inclusion 2: 13h à 15h
Inclusion 3: 11h à 12h
Ma problématique est de trouver la prochaine date ou je pourrais afficher mon message qui correspond à la condition suivante:
- Etre dans aucune des plages d'exclusions
(ET) - être dans l'une des inclusions.
Exemple:
- S'il est 7h, mon message s'affichera à 8h30.
- S'il est 10h, mon message s'affichera à 14h.
- S'il est 14h30, mon message s'affichera à 14h30.
Merci d'avance pour vos conseils et pistes
Réponses
Sans considérer les questions de NSDate, je ferai une itération
pour tester si un date Sélectonnée est ok, tu refais une itération :
Comment as-tu structuré des données ? De combien de dates d'inclusion/d'exlcusion disposes-tu ?
Pourquoi les créneaux d'inclusions ne suffisent-ils pas ?
On ne peut pas être à la fois dans un créneau d'inclusion et d'exclusion.
Pour simplifier l'algorithme, ce que je ferais c'est créer une structure intermédiaire qui "normalise" les périodes d'inclusion/d'exclusion.
Ce qui me paraà®t compliqué en l'occurrence c'est que :
- les périodes d'exclusion peuvent se recouvrir entre elles
- les périodes d'inclusion peuvent se recouvrir entre elles
- les périodes d'inclusion et d'exclusion peuvent se recouvrir mutuellement
Ce que j'appelle une structure "normalisée" c'est une structure dans laquelle les périodes d'un type ne se recouvrent plus.
Par exemple avec ton exemple de périodes d'exclusion, je créerais une structure intermédiaire :
- Exclusion 1' : 6 à 8h
Salut,
Je suis sur le même projet mais côté Android, du coup j'ai la même problématique en Java.
Du coup comment déterminer les dates dispo ?
Au niveau de la structure des données, on reçoit des règles de récurrences du serveur. A partir de ces règles (par exemple : tous les 1er lundi du mois, un mois sur deux) on traduit en plages horaires (inclusions ou exclusions). Une fois la liste de toutes les plages, on essaye de trouver la prochaine date disponible qui respecte les conditions.
Au niveau du nombre de plages, cela peut varier de 1 à plusieurs centaines selon la complexité.
Les créneaux d'inclusions et d'exclusions peuvent se chevaucher, comme dans l'exemple. Et on utilise inclusions et exclusions pour simplifier la règle de récurrence (par exemple si on veut afficher tous les 1er lundi du mois de 8 à 10h, la définition de cette règle est simple (en une règle c'est bon) alors que s'il fallait utiliser que des exclusions, il faudrait 3 règles d'exclusions.
On y a penser mais le calcul des inclusions sans les plages d'exclusions pose problème, c'est sur ça qu'on bloque.
En première approximation (et en travaillant uniquement avec des Zones normalisées et ordonnées) :
- Prendre la date de début (dd) de la première zone d'inclusion (ZI)
- Déterminer si cette date de début est à l'intérieur d'une zone d'exclusion (ZE)
- Si c'est le cas, prendre la date de fin de la période d'exclusion (dd = fin(ZE))
- Vérifier si (dd) est à l'intérieur de (ZI)
- Si ce n'est pas le cas la zone ZI est entièrement exclue, passer à la zone d'inclusion suivante (reboucler tout en haut)
- Si on arrive ici, on sait qu'on a une Zone d'inclusion expurgée qui démarre en dd, il faut déterminer la date de fin (df)
- Comparer la date de fin (df) de la zone d'inclusion (ZI) avec la date de début (de) de la zone d'exclusion suivante (ZE+1)
- Si df <= de, on peut créer une zone d'inclusion expurgée [dd – df]
- Sinon, on crée une zone d'exclusion expurgée [dd - de], on fait dd = de et on reboucle à la troisième ligne (pour prendre en compte le cas d'une zone d'inclusion qui serait scindée par des zones d'exclusion au milieu)
- la date actuelle
- une date de fin de période d'exclusion
- une date de début de période d'inclusion
Donc, tu iteres sur ces dates en prenant la première qui est bonne.