DTSTART y DTEND no forman parte de iCalendar RRULE y no deben incluirse al ejecutar .toString().
Tal vez genere algo como "DTSTART=x;DTEND=x;RRULE=x" que sería una sintaxis válida de iCalendar.
también más 1 esto
De acuerdo: esto está causando algunos problemas al interoperar con otras implementaciones (por ejemplo, _Python dateutil_)
:+1: para este problema
AFAIK, siempre se supone que DTSTART es una línea diferente, no solo delimitada por ;
, como el ejemplo al que se hace referencia en el n. ° 84 (las nuevas líneas son significativas):
DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR
No _creo_ (pero espero la corrección si es incorrecto) que concatenar estas líneas con ;
sea RFC 5545 válido.
@jkbrzt , ¿acepta solicitudes de incorporación de cambios para esto?
Dado que esto sería un cambio importante, podría imaginar implementarlo en una función separada, por ejemplo, icalString()
y dar una opción al analizador también.
Para cualquier otra persona que se encuentre con este problema, creé una función de ayuda que parece funcionar para mis necesidades (nota: está escrito en mecanografiado)
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');
}
Le das un RRuleSet
y una fecha de inicio (lo configuré para usarlo con fechas Moment
, pero entiendes la idea) y pasa y elimina cualquier sección de ;DTSTART=...;
en el RRuleSet. Luego agrega una sección DTSTART
con el formato adecuado al principio del conjunto de reglas y luego une todas las secciones.
Nota: Creo que solo se supone que hay un DTSTART
presente. Sin embargo, tal vez haya sabores de iCalendar en los que esto no sea cierto (fuera de mi caso de uso).
Para obtener una cadena de regla compatible (sin DTSTART), una opción es usar RRule.optionsToString
directamente:
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)
¿Algún avance en esto? No es demasiado difícil obtener una cadena de reglas compatible, gracias al consejo de @phillbaker , pero sería bueno poder conectar y jugar con dateutil de Python.
De acuerdo, hay algunas diferencias en la sintaxis con el RFC y con Python. ¡Estaría muy abierto a una solicitud de extracción que aborde esto!
Ahora que se ha implementado TZID
(#261), la biblioteca ya no puede analizar las cadenas que genera. Creo que se puede llegar a una solución compatible con versiones anteriores al continuar analizando las cadenas de salida anteriores a 2.4.0, pero generando cadenas compatibles con RFC.
^ mi última declaración aquí ("la biblioteca ya no puede analizar las cadenas que genera") ahora es incorrecta, esto se solucionó en el n. ° 267. Aún así, ¡sería ideal cumplir con el RFC!
Reparado por # 269
Comentario más útil
:+1: para este problema
AFAIK, siempre se supone que DTSTART es una línea diferente, no solo delimitada por
;
, como el ejemplo al que se hace referencia en el n. ° 84 (las nuevas líneas son significativas):No _creo_ (pero espero la corrección si es incorrecto) que concatenar estas líneas con
;
sea RFC 5545 válido.