1001Ferramentas
🔁 Geradores

Gerador RRULE iCal (RFC 5545)

Gera regras de recorrência RRULE conforme RFC 5545 com FREQ, BYDAY, INTERVAL, COUNT/UNTIL preview das próximas 10 ocorrências.

RRULE

    
Próximas 10 ocorrências

    

RRULE: a gramática de recorrência calendar-aware do iCalendar

RRULE é abreviação de Recurrence Rule e é a propriedade do formato iCalendar (RFC 5545, Seção 3.8.5.3) que descreve como um VEVENT, VTODO ou VJOURNAL se repete. Em vez de materializar cada ocorrência no disco, a regra é armazenada uma vez e os clientes a expandem em tempo real — por isso uma "reunião semanal para sempre" ocupa algumas dezenas de bytes em vez de milhares de linhas. Diferente de uma expressão cron, RRULE é calendar-aware: entende meses de tamanhos diferentes, dias da semana, anos bissextos, posições ordinais ("última sexta") e a diferença entre hora local e UTC.

A regra mínima é RRULE:FREQ=DAILY;COUNT=10. O token FREQ aceita SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY e YEARLY. Modificadores refinam a cadência: INTERVAL (a cada N unidades — INTERVAL=2 em regra semanal vira "a cada duas semanas"), COUNT (exatamente N ocorrências), UNTIL (encerra em um instante UTC específico), BYDAY (lista separada por vírgula com MO,TU,WE,TH,FR,SA,SU), BYMONTHDAY (1,15 para dia 1 e 15), BYMONTH, BYSETPOS (pega a N-ésima ocorrência dentro de um conjunto) e WKST (qual dia começa a semana — padrão segunda).

Exemplos práticos

# Diariamente por dez dias
RRULE:FREQ=DAILY;COUNT=10

# Toda sexta-feira, sem fim
RRULE:FREQ=WEEKLY;BYDAY=FR

# Última sexta do mês
RRULE:FREQ=MONTHLY;BYDAY=-1FR

# Aniversário em 15 de maio todo ano
RRULE:FREQ=YEARLY;BYMONTH=5;BYMONTHDAY=15

# Dia 1 e dia 15 de cada mês
RRULE:FREQ=MONTHLY;BYMONTHDAY=1,15

# Seg/Qua/Sex por 12 semanas
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=12

EXDATE, RDATE e padrões complexos

Agendas reais são bagunçadas. Para pular uma ocorrência (um cancelamento pontual de feriado, por exemplo), adicione uma linha EXDATE com o horário exato da instância pulada. Para injetar uma ocorrência extra que a regra não cobre, use RDATE. Combinado com BYSETPOS ("a segunda terça de cada mês" → FREQ=MONTHLY;BYDAY=TU;BYSETPOS=2), o combo de quatro propriedades cobre quase toda regra de negócio que um app de agenda vai precisar sem cair em materializar linhas.

Compatibilidade, bibliotecas e horário de verão

RRULE é suportado por todo cliente de calendário relevante: Google Agenda, Microsoft Outlook, Apple Calendar, Fantastical, Notion Calendar, Thunderbird Lightning e qualquer servidor CalDAV (Nextcloud, Radicale, Baikal, Apple iCloud). No lado do código, bibliotecas maduras cuidam da expansão: rrule.js (Jakub Roztocil, a implementação JS de facto — também é a que move este gerador), o módulo rrule do python-dateutil, o iCal4j (Java) e o recurring_events_for (Ruby). Casos de borda para testar: transições de horário de verão (um evento às 02:30 local durante a virada para frente simplesmente não existe naquele dia), anos bissextos (eventos em 29 de fevereiro) e variações de fim de mês (o dia 31 em fevereiro — a maioria dos clientes descarta silenciosamente, mas confira). No Brasil o horário de verão foi extinto em 2019, então DST só importa para agendas que cruzam fronteiras.

Perguntas frequentes

Por que não usar cron? Cron é granular em minutos e vive no sistema operacional — não entende calendários, dias da semana, ordinais como "última sexta" ou feriados. RRULE é calendar-aware e vive dentro do evento .ics, então viaja junto com o convite de reunião.

O suporte é mesmo universal? Sim — Google, Apple, Microsoft e todo cliente CalDAV leem e escrevem RRULE porque é a única gramática de recorrência do padrão iCalendar.

Posso combinar COUNT e UNTIL? Não — a RFC 5545 proíbe. Use um ou outro; UNTIL tem precedência nos clientes que violam a spec.

O que o WKST muda? Só importa com BYWEEKNO ou regras semanais que cruzam fronteira de semana. No Brasil é comum a semana começar no domingo (WKST=SU); no ISO 8601 (e padrão da RRULE) começa na segunda (WKST=MO).

Ferramentas Relacionadas