Rrule: Devrait utiliser DTSTART comme première occurrence

Créé le 25 janv. 2015  ·  10Commentaires  ·  Source: jakubroztocil/rrule

Selon la spécification iCalendar :

 The "DTSTART" property defines the first instance in the recurrence set.

Et il comprend un exemple de ceci:

 Every other week on Monday, Wednesday and Friday until December 24,
 1997, but starting on Tuesday, September 2, 1997:

 DTSTART;TZID=US-Eastern:19970902T090000
 RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
  BYDAY=MO,WE,FR
 ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
 1,3,13,15,17
     (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
                       December 8,10,12,22

rrule.js n'inclut pas le 2 septembre comme occurrence. Dans rrule.js, la première occurrence est le 3 septembre.

Commentaire le plus utile

Je suis d'accord, par défaut le dtstart devrait être inclusif pour être plus cohérent avec les autres systèmes.

J'ai réalisé un codepen démontrant les subtilités du comportement actuel : https://codepen.io/arshaw/pen/qwEQNO?editors=0010

Tous les 10 commentaires

Plus 1 à ce sujet. RRule ne respecte pas du tout la date de début/la durée sur l'application de démonstration

D'accord, cela m'a déconcerté lorsque j'ai traité avec Google RFC 2445 java lib.

:+1: C'est ainsi que fonctionne le calendrier standard (et conforme comme Google Calendar, Apple (Mac OS/iOS/iCloud).

@jkbrzt , À l'heure actuelle, rrule.js est lié à la fonctionnalité de python dateutil

Contrairement à ce qui est documenté dans la RFC, la date/heure de début (dtstart) n'est pas la première instance de récurrence, à moins qu'elle ne corresponde aux règles spécifiées.
–– dateutil docs

Cela semblerait être un écart important par rapport à dateutil, ce qui semblerait logique dans ce cas. Cela impliquerait de changer presque tous les cas de test. Les pensées? Souhaitez-vous soutenir le changement?

@hwangmoretime J'ai fusionné vos modifications dans la documentation README où rrule.js diffère de la RFC, merci pour cela. Oui, il serait très logique de rendre rrule.js conforme (ce problème + l'argument du mot-clé byday ). Cela brisera la compatibilité descendante, il doit donc être bien documenté.

Je crois qu'il y a encore un bug. Cela fonctionne pour all() mais pas pour la méthode between . Dans l'exemple ci-dessous, j'ai défini dtstart et rdate sur un objet RRuleSet , conformément au fichier readme.

screen shot 2016-03-19 at 1 41 49 pm

rruleSet
RRuleSet {_cache: Object, _rrule: Array[1], _rdate: Array[1], _exrule: Array[0], _exdate: Array[0]}

rruleSet.valueOf()
["RRULE:FREQ=YEARLY;DTSTART=20120122T000000Z;INTERVAL=1;WKST=0;BYMONTH=3;BYMONTHDAY=19;BYHOUR=13;BYMINUTE=39;BYSECOND=27", "RDATE:20120122T000000Z"]

rruleSet.all()[0]
Sat Jan 21 2012 16:00:00 GMT-0800 (PST)

rruleSet.between(startDatetime, endDatetime)
[Sat Mar 19 2016 13:39:27 GMT-0700 (PDT)]

notez que pour l'appel à la méthode all , la date renvoyée correspond à l'original dtstart mais pour between , elle revient par défaut à l'heure actuelle

voici un peu plus de contexte. Pour autant que je sache, le jeu de règles fait exactement le contraire de ce à quoi je m'attendais. Il produit une liste de dates, où l'élément zéro est le début de l'événement d'origine souhaité. Mais c'est l'heure actuelle qui se développe en une série de dates. Je m'attendais à recevoir une liste de dates le 21 janvier, mais rruleset "s'est reproduit" en utilisant l'heure actuelle (22 mars).

screen shot 2016-03-22 at 6 02 21 pm

J'ai retiré le repo et j'essaie de réduire cela avec quelques tests, mais tout conseil est apprécié.

J'ai eu un problème similaire avec dtstart. Voir https://stackoverflow.com/questions/54517101/rrule-not-setting-correct-time-if-dtstart-is-set
Lorsque je définis dtstart dans le constructeur, j'obtiens des heures correctes avec .all() mais si je définis dtstart par la suite, j'obtiens l'heure actuelle.

Je suis d'accord, par défaut le dtstart devrait être inclusif pour être plus cohérent avec les autres systèmes.

J'ai réalisé un codepen démontrant les subtilités du comportement actuel : https://codepen.io/arshaw/pen/qwEQNO?editors=0010

par défaut, le dtstart doit être inclusif pour être plus cohérent avec les autres systèmes.

D'accord. Se mettre à jour sur rrule maintenant. C'est un gain de temps considérable (merci !), mais cette date inclusive émet une nuance étrange qui nécessite une logique personnalisée à traiter. J'adorerais voir cette mise à jour. J'ai compris que le comportement actuel est cohérent avec python-dateutil, mais je pense que la priorité devrait être sur un comportement cohérent avec la norme RFC, plutôt que de perpétuer un écart étrange.

Aussi, par commentaire ci-dessous:

Notez que vous pouvez obtenir le comportement d'origine en utilisant un RRuleSet et en ajoutant le dtstart comme rdate.

Pour autant que je sache, cela sous-estime considérablement la complexité de la solution de contournement nécessaire pour de nombreux cas d'utilisation.

Par exemple, supposons que vous ayez les paramètres de règle suivants :

new RRule({
  freq: RRule.WEEKLY,
  dtstart: new Date(Date.UTC(2020, 10, 1, 21, 0, 0)),
  count: 10,
  interval: 2,
  byweekday: RRule.MO
})

Cela devrait se traduire par "toutes les 2 semaines le lundi 10 fois", avec une date de début le dimanche 1er novembre 2020.

Maintenant, le tout premier lundi du calendrier après la date de début est le 2 novembre... donc, avec un intervalle de 2, nous nous attendrions à ce que les dates des événements générés soient le 2 novembre, le 16 novembre, le 30 novembre, etc.

Cependant, le forfait rrule nous donne plutôt les dates du 9 novembre, 23 novembre, etc. En d'autres termes, tout notre intervalle est faux, décalé d'une semaine. Résoudre ce problème n'est pas aussi simple que "d'utiliser un RRuleSet et d'ajouter le dtstart en tant que rdate". Il y a un peu plus de travail pour ce type de correctif.

image

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Prinzhorn picture Prinzhorn  ·  15Commentaires

shavenwalrus picture shavenwalrus  ·  7Commentaires

shorlbeck picture shorlbeck  ·  21Commentaires

espen picture espen  ·  11Commentaires

elazar picture elazar  ·  18Commentaires