Skip to content

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.

Caixa de diálogo de novo evento

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, como FREQ=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 coluna date redundante que espelha o valor de UNTIL, 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, sem COUNT. O evento se repete indefinidamente. Bom para serviços semanais em andamento.
  • Após N ocorrênciasCOUNT=10. Útil para campanhas com tempo limitado ("aula de discipulado de dez semanas").
  • Em uma data específicaUNTIL=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:

EventoFrequênciaConfigurações extras
Culto de DomingoSemanalBYDAY=SU, fim nunca
Oração de quarta + sextaSemanalBYDAY=WE,FR, fim nunca
Comunhão no primeiro domingoMensalNésimo dia da semana (1º domingo), fim nunca
Oferta dos líderes no dia 15MensalDia do mês (15), fim nunca
Série de Páscoa de seis semanasSemanalBYDAY=SU, fim após 6 ocorrências
Dia anual dos fundadoresAnualfim nunca
Devocional diário de AdventoDiáriafim 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.