DTSTART et DTEND ne font pas partie de iCalendar RRULE et ne doivent pas être inclus lors de l'exécution de .toString().
Peut-être générer quelque chose comme "DTSTART=x;DTEND=x;RRULE=x" qui serait une syntaxe iCalendar valide.
aussi plus 1 ceci
D'accord - cela cause des problèmes lors de l'interaction avec d'autres implémentations (par exemple, _Python dateutil_)
:+1: pour ce problème
AFAIK, DTSTART est toujours censé être une ligne différente, pas seulement délimitée par ;
, donc comme l'exemple référencé dans # 84 (les retours à la ligne sont significatifs):
DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR
Je ne pense pas (mais j'attends une correction en cas d'erreur) que la concaténation de ces lignes avec un ;
est une RFC 5545 valide.
@jkbrzt acceptez -vous les demandes d'extraction pour cela ?
Puisqu'il s'agirait d'un changement radical, je pourrais imaginer l'implémenter dans une fonction distincte, par exemple icalString()
et donner également une option à l'analyseur.
Pour toute autre personne rencontrant ce problème, j'ai créé une fonction d'assistance qui semble répondre à mes besoins (remarque : elle est écrite en caractères dactylographiés)
export function rrulesetToIcalString(schedule: RRuleSet, startDate: Moment): string {
// matches `;DTSTART=20180125T080000Z` until `;` or end
const icalStrings = schedule.valueOf().map(ruleString => ruleString.replace(/;DTSTART=.*?(?=(?:;)|$)/, ''));
icalStrings.unshift(`DTSTART;TZID=UTC:${startDate.utc().format('YYYYMMDDTHHmmss')}`);
return icalStrings.join('\n');
}
Vous lui donnez un RRuleSet
et un startDate (je l'ai configuré pour une utilisation avec des dates Moment
, mais vous avez l'idée) et il passe et supprime toutes les sections ;DTSTART=...;
dans l'ensemble de règles RRuleSet. Il ajoute ensuite une section DTSTART
correctement formatée au début du RuleSet, puis il joint toutes les sections ensemble.
Remarque : je _pense_ qu'il n'y a qu'une seule DTSTART
présente. Cependant, il existe peut-être des versions d'iCalendar où ce n'est pas vrai (en dehors de mon cas d'utilisation).
Pour obtenir une chaîne de règles conforme (sans le DTSTART), une option consiste à utiliser RRule.optionsToString
directement :
var rule = new RRule({
freq: RRule.WEEKLY,
interval: 5,
byweekday: [RRule.MO, RRule.FR],
dtstart: new Date(2012, 1, 1, 10, 30),
until: new Date(2012, 12, 31)
});
var copy = Object.assign({}, rule.origOptions);
delete copy.dtstart
RRule.optionsToString(copy)
Une mise à jour pour ceci? Pas trop difficile d'obtenir une chaîne de règles conforme, grâce aux conseils de @phillbaker , mais ce serait bien de pouvoir brancher et jouer avec le dateutil de Python.
D'accord, il y a quelques différences de syntaxe avec la RFC et avec Python. Serait très ouvert à une demande de tirage pour résoudre ce problème !
Maintenant que TZID
a été implémenté (#261), la bibliothèque ne peut plus analyser les chaînes qu'elle sort. Je pense qu'une solution rétrocompatible peut être atteinte en continuant à analyser les chaînes de sortie antérieures à la version 2.4.0, mais en produisant des chaînes conformes à la RFC.
^ ma dernière déclaration ici ("la bibliothèque ne peut plus analyser les chaînes qu'elle produit") est maintenant incorrecte, cela a été corrigé par # 267. Pourtant, l'idéal serait de se conformer à la RFC !
Corrigé par #269
Commentaire le plus utile
:+1: pour ce problème
AFAIK, DTSTART est toujours censé être une ligne différente, pas seulement délimitée par
;
, donc comme l'exemple référencé dans # 84 (les retours à la ligne sont significatifs):Je ne pense pas (mais j'attends une correction en cas d'erreur) que la concaténation de ces lignes avec un
;
est une RFC 5545 valide.