Aller au contenu

Règles

phil/recurrence

RecurrenceRule::parse() lit une règle telle que l'écrit la RFC 5545, avec ou sans RRULE:, ses parties dans n'importe quel ordre et n'importe quelle casse. (string) $rule la réécrit, ses parties dans un ordre fixe, sans celles qui ont leur valeur par défaut.

$rule = RecurrenceRule::parse('rrule:freq=weekly;interval=2;byday=mo,we;until=20261231T235959Z');
(string) $rule;   // "FREQ=WEEKLY;INTERVAL=2;UNTIL=20261231T235959Z;BYDAY=MO,WE"
PartieContient
FREQYEARLY, MONTHLY, WEEKLY ou DAILY
INTERVALToutes les tant de périodes, 1 par défaut
COUNT, UNTILTant d'occurrences, ou le dernier moment où une occurrence peut commencer : un jour (20261231), une heure UTC (…T235959Z), ou une heure flottante lue dans le fuseau horaire donné à parse()
BYDAYDes jours de la semaine, avec leur rang dans le mois ou l'année pour les règles mensuelles et annuelles : MO, 2TU, -1FR
BYMONTHDAYDes jours du mois, comptés depuis la fin s'ils sont négatifs : 1, 15, -1
BYMONTHDes mois, de 1 à 12
BYSETPOSLes rangs, dans chaque période, des jours que gardent les autres parties : -1, le dernier
WKSTLe jour où commencent les semaines, lundi par défaut

RecurrenceRule::of() en construit une à partir de ses parties.

Ce qui est vérifié

Comme le demande la RFC 5545, une règle est refusée avec InvalidRule pour : un intervalle ou un décompte inférieur à 1 ; à la fois un décompte et une fin ; un jour de fin sans sa fin ; un rang dans le mois ou l'année dans une règle hebdomadaire ou quotidienne, au-delà de 5 dans une règle mensuelle, au-delà de 53 ou égal à 0 où que ce soit ; des jours du mois dans une règle hebdomadaire, au-delà de 31 ou égaux à 0 ; des mois hors de 1 à 12 ; des positions au-delà de 366 ou égales à 0, ou sans autre partie BY. Les fréquences horaires et plus fines, BYHOUR, BYMINUTE, BYSECOND, BYWEEKNO et BYYEARDAY ne sont pas lues : InvalidRule les nomme.

of() et parse() refusent les mêmes règles, pour que toute règle écrite en texte se relise : un intervalle ou un décompte au-dessus de RecurrenceRule::MAX_NUMBER, 9999, les quatre chiffres que lit parse() ; une fin hors des années 1 à 9999, en UTC pour une heure de fin et telle quelle pour un jour de fin, puisque UNTIL écrit son année avec quatre chiffres. Une règle que construit un formulaire ou une importation peut donc être stockée puis hydratée à nouveau.