DTSTART e DTEND não fazem parte do iCalendar RRULE e não devem ser incluídos ao fazer .toString().
Talvez gere algo como "DTSTART=x;DTEND=x;RRULE=x" que seria uma sintaxe válida do iCalendar.
também mais 1 isso
Acordado - isso está causando algum problema ao interoperar com outras implementações (por exemplo, _Python dateutil_)
:+1: para este problema
AFAIK, DTSTART sempre deve ser uma linha diferente, não apenas delimitada por ;
, assim como o exemplo referenciado em #84 (novas linhas são significativas):
DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR
Eu não _acho_ (mas aguardo correção se estiver errado) que concatenar essas linhas com um ;
é RFC 5545 válido.
@jkbrzt você aceita Pull Requests para isso?
Uma vez que esta seria uma mudança de ruptura, eu poderia imaginar implementá-la em uma função separada, por exemplo icalString()
e dar uma opção para o analisador também.
Para qualquer outra pessoa com esse problema, criei uma função auxiliar que parece funcionar para minhas necessidades (nota: está escrito em texto datilografado)
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');
}
Você dá a ele um RRuleSet
e um startDate (eu o configurei para uso com datas Moment
, mas você entendeu) e ele remove todas as seções ;DTSTART=...;
em o RRuleSet. Em seguida, ele adiciona uma seção DTSTART
devidamente formatada no início do RuleSet e, em seguida, une todas as seções.
Nota: Eu _acho_ que deve haver apenas um DTSTART
presente. Talvez existam sabores iCalendar onde isso não é verdade, no entanto (fora do meu caso de uso).
Para obter uma string de regra compatível (sem o DTSTART), uma opção é usar RRule.optionsToString
diretamente:
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)
alguma atualização disso? Não é muito difícil obter uma string de regra compatível, graças ao conselho de @phillbaker , mas seria bom poder conectar e jogar com o dateutil do Python.
Concordo, existem algumas diferenças na sintaxe com o RFC e com o Python. Estaria muito aberto a um pull request abordando isso!
Agora que TZID
foi implementado (#261), a biblioteca não pode mais analisar as strings que ela produz. Eu acho que uma solução compatível com versões anteriores pode ser alcançada continuando a analisar strings de saída pré-2.4.0, mas produzindo strings compatíveis com RFC.
^ minha última declaração aqui ("a biblioteca não pode mais analisar as strings que ela produz") agora está incorreta, isso foi corrigido apenas pelo #267. Ainda assim, seria ideal estar em conformidade com a RFC!
Corrigido por #269
Comentários muito úteis
:+1: para este problema
AFAIK, DTSTART sempre deve ser uma linha diferente, não apenas delimitada por
;
, assim como o exemplo referenciado em #84 (novas linhas são significativas):Eu não _acho_ (mas aguardo correção se estiver errado) que concatenar essas linhas com um
;
é RFC 5545 válido.