Padrões recorrentes e RRULE
A maioria das coisas que você coloca no calendário acontece mais de uma vez. Uma reunião semanal de jovens, um almoço mensal de líderes, um domingo anual de batismo — o GCM lida com todos eles através de um seletor no formulário de evento, apoiado pelo padrão iCalendar RRULE (RFC 5545).
O seletor de recorrência aparece quando você muda o menu Frequência de Nenhuma.

O que é armazenado
Quando você salva um evento recorrente, o GCM escreve três colunas na linha events:
rrule_string— a string de recorrência autoritativa, comoFREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20261231T235959Z.recurrence_rule— um código curto legado (weekly,monthly,yearly) mantido para compatibilidade retroativa com consultas antigas.recurrence_end_date— uma colunadateredundante que espelha o valor deUNTIL, usada para filtragem SQL rápida.
O navegador analisa rrule_string e expande as ocorrências diretamente na visão do calendário — não há um cron no servidor preenchendo uma tabela de datas. Isso mantém o banco pequeno (uma linha por série, não uma linha por domingo) e significa que edições na regra propagam instantaneamente para cada data futura.
Opções de frequência
O seletor oferece cinco opções:
Diária
FREQ=DAILY. Use com moderação — eventos diários poluem rápido o calendário. O caso comum é uma campanha de curto prazo: Oração matinal diária durante a Quaresma. Combine com uma data de fim para que pare na Páscoa.
Semanal
FREQ=WEEKLY mais uma lista BYDAY opcional. As caixas de seleção dos dias permitem escolher vários dias da semana de uma vez: um grupo de oração de segunda/quarta/sexta é um evento com BYDAY=MO,WE,FR, não três eventos separados.
Se você deixar as caixas dos dias vazias, o GCM repete no mesmo dia da semana que a data de início. Então um evento começando numa terça sem BYDAY selecionado vira "toda terça".
Quinzenal
FREQ=WEEKLY;INTERVAL=2. Mesmo seletor da semanal, mas o evento pula uma semana sim outra não. Comum para células que se reúnem em domingos alternados, ou para reuniões de equipe em ritmo quinzenal.
Mensal
FREQ=MONTHLY com a escolha de dois modos:
- Dia do mês (
BYMONTHDAY=15) — o dia 15 de cada mês, independentemente do dia da semana. Pega o número do dia a partir da sua data de início. - Nésimo dia da semana (
BYDAY=3SU) — o 3º domingo de cada mês. Útil para reuniões de líderes ou serviços de unção que seguem um padrão de domingo em vez de uma data de calendário.
O seletor mostra ambas as opções como botões de rádio. Escolha dia do mês para eventos de estilo financeiro ("o dia 1 de cada mês"); escolha nésimo dia da semana para eventos de estilo serviço ("primeiro domingo do mês").
Anual
FREQ=YEARLY. A mesma data do calendário uma vez por ano — aniversários, serviços do dia de fundação, conferências anuais. O GCM deriva o mês e o dia a partir da data de início do evento, então você não precisa digitá-los de novo.
Condições de fim
Cada recorrência escolhe um de três modos de fim:
- Nunca — sem
UNTIL, semCOUNT. O evento se repete indefinidamente. Bom para serviços semanais em andamento. - Após N ocorrências —
COUNT=10. Útil para campanhas com tempo limitado ("aula de discipulado de dez semanas"). - Em uma data específica —
UNTIL=20261231T235959Z. Comum para temporadas de ministério que terminam no final do ano.
Se você escolher nunca, o calendário ainda expande as ocorrências até o final do mês atualmente visível — não há loop infinito porque a expansão é limitada pela janela de visualização.
Escolhendo o padrão certo
Alguns exemplos do mundo real e as configurações do seletor que combinam:
| Evento | Frequência | Configurações extras |
|---|---|---|
| Culto de Domingo | Semanal | BYDAY=SU, fim nunca |
| Oração de quarta + sexta | Semanal | BYDAY=WE,FR, fim nunca |
| Comunhão no primeiro domingo | Mensal | Nésimo dia da semana (1º domingo), fim nunca |
| Oferta dos líderes no dia 15 | Mensal | Dia do mês (15), fim nunca |
| Série de Páscoa de seis semanas | Semanal | BYDAY=SU, fim após 6 ocorrências |
| Dia anual dos fundadores | Anual | fim nunca |
| Devocional diário de Advento | Diária | fim em data (25 de dezembro) |
Para serviços com presença rastreada como o domingo de manhã, você não precisa de um evento de calendário recorrente — veja Reuniões e níveis de escopo para o padrão certo. Eventos de calendário com recorrência são para coisas das quais as pessoas precisam de um lembrete visual; reuniões são para coisas contra as quais você registra uma lista.
Compatibilidade retroativa
O GCM ainda entende a coluna mais antiga recurrence_rule (weekly / monthly / yearly) para eventos criados antes do seletor de RRULE entrar no ar. Quando você edita um desses eventos legados, o seletor mapeia o código curto para seu equivalente RRULE mais próximo e escreve ambos os campos de volta. Novos eventos sempre escrevem ambos; a RRULE é autoritativa quando ambos estão presentes.
Se a análise da RRULE falhar — uma string corrompida por uma edição manual, por exemplo — o calendário recai para a interpretação da recurrence_rule legada. Você não vai perder datas, mas pode perder a nuance (um evento legado de diário-com-data-de-fim vira um fallback de diário-para-sempre).
O que fazer quando uma data é diferente
A recorrência escolhe o padrão. Quando uma ocorrência específica precisa ser cancelada ou movida — o culto da Véspera de Natal substituindo o slot habitual do domingo de manhã, por exemplo — não reescreva a RRULE. Use exceções de evento. Elas substituem uma única data sem perturbar o resto da série.
