Como converter horário escolar em .ics com IA: guia para devs

Como converter horário escolar em .ics com IA: guia para devs

Passar um horário escolar — aquele PDF ou foto meio borrada que o colégio manda no WhatsApp — para o calendário digital pode virar uma dor de cabeça de horas. Eu já fiz isso na unha, criando evento por evento, e perdi um domingo inteiro. Segundo o Sapo.pt, a saída inteligente é usar IA para gerar o ficheiro .ics e importar tudo de uma vez. Concordo, mas tem detalhes técnicos que a maioria dos tutoriais ignora — e são justamente esses detalhes que separam um horário funcional de uma bagunça que te atrasa o ano letivo todo.

Por que o formato .ics continua rei (mesmo em 2026)

O iCalendar (RFC 5545) é um padrão aberto desde 2009 e, na minha experiência, ainda é o mais portável que existe. Google Calendar, Apple Calendar, Outlook, Thunderbird, até o Nextcloud corporativo que já vi em prefeituras brasileiras — todos importam .ics. Quando eu peço para uma IA gerar um “horário”, eu sempre exijo .ics, nunca JSON proprietário ou planilha. Por quê? Porque é texto puro, você abre no Notepad e depura. Já recebi ficheiros .ics com DTSTART em fuso errado e só descobri abrindo o ficheiro bruto.

Um .ics mínimo de evento recorrente se parece com isto:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//YuriDev//Horario Escolar PT//PT
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
UID:2026-matematica-seg-qua@yurideveloper.com.br
DTSTAMP:20260901T120000Z
DTSTART;TZID=Europe/Lisbon:20260914T090000
DTEND;TZID=Europe/Lisbon:20260914T100000
RRULE:FREQ=WEEKLY;BYDAY=MO,WE;UNTIL=20270630T235959Z
SUMMARY:Matemática — Prof. Silva
LOCATION:Sala 12
DESCRIPTION:Aula de Matemática. Trazer calculadora.
END:VEVENT
END:VCALENDAR

Repara em três detalhes críticos: o UID único (se repetir, o calendário cria duplicados), o TZID=Europe/Lisbon (essencial em Portugal, senão o evento “salta” no horário de verão), e o RRULE com UNTIL bem definido (senão o evento repete até 2030).

A stack técnica que eu recomendo na prática

Testei várias combinações nos últimos anos com clientes e amigos. Para este tipo de tarefa, o fluxo mais confiável é:

  1. Gemini 2.5 Pro ou GPT-4o para visão computacional — leem horário em imagem com precisão muito superior ao GPT-3.5.
  2. Prompt estruturado forçando saída em .ics com TZID e RRULE explícitos.
  3. Validador online antes de importar — eu uso o iCalendar Validator para confirmar sintaxe.
  4. Importação num calendário dedicado, nunca no principal. Se algo correr mal, você apaga o calendário novo e acabou.

A IA generativa acerta, na minha experiência, cerca de 85–95% dos campos. Os 5–15% que falha são exatamente onde devs precisam olhar: fuso horário, exceções (feriados, aulas canceladas), e formatação de RRULE em aulas quinzenais.

Na Prática: o prompt que eu realmente uso

Quando alguém me pede ajuda com horário escolar, eu disparo este prompt (adapto consoante a imagem):

A partir da imagem anexa do meu horário escolar, gera um ficheiro .ics
válido (RFC 5545) com:

- Fuso horário: Europe/Lisbon
- Início: 14 de setembro de 2026
- Fim: 30 de junho de 2027
- Excluir feriados nacionais portugueses
- Cada aula deve ter UID único, SUMMARY com disciplina e professor,
  LOCATION com a sala, DESCRIPTION com material necessário
- Usar RRULE com UNTIL para recorrência semanal
- Comentários (#) explicando cada bloco

Não retornes JSON, nem tabela. Retorna apenas o conteúdo bruto do .ics.

Por que este prompt funciona? Porque elimina ambiguidade. Quando digo “feriados nacionais portugueses”, a IA sabe incluir Santo António, Imaculada Conceição e Dia de Portugal via EXDATE. Quando imponho formato bruto, ela não tenta “embelezar” e quebrar a sintaxe. Quando peço comentários, eu posso revisar o ficheiro antes de importar.

Depois do ficheiro gerado, eu sigo este checklist de 5 pontos:

  1. Abro o .ics no Notepad++ e confirmo que começa com BEGIN:VCALENDAR.
  2. Conto os BEGIN:VEVENT — deve bater com o número de disciplinas.
  3. Subo no validador online (icalendar.org).
  4. Importo num calendário novo no Google Calendar chamado “Teste Horário”.
  5. Verifico 3 eventos aleatórios antes de migrar para o calendário oficial.

Automatizando para quem programa: gerar .ics sem IA

Se você é dev e quer ainda mais controle, dá para gerar o .ics programaticamente. Em Node.js, a biblioteca ics faz isso em poucas linhas:

const ics = require('ics');

const events = [
  {
    title: 'Matemática — Prof. Silva',
    description: 'Trazer calculadora científica',
    location: 'Sala 12',
    start: [2026, 9, 14, 9, 0],
    startInputType: 'local',
    duration: { hours: 1 },
    startOutputType: 'local',
    recurrenceRule: 'FREQ=WEEKLY;BYDAY=MO,WE;UNTIL=20270630T235959Z',
    timezone: 'Europe/Lisbon'
  },
  {
    title: 'Física — Prof. Costa',
    location: 'Lab 3',
    start: [2026, 9, 15, 10, 30],
    duration: { hours: 1, minutes: 30 },
    recurrenceRule: 'FREQ=WEEKLY;BYDAY=TU;UNTIL=20270630T235959Z',
    timezone: 'Europe/Lisbon'
  }
];

const { error, value } = ics.createEvents(events);

if (error) {
  console.error('Erro a gerar ICS:', error);
} else {
  require('fs').writeFileSync('horario.ics', value);
  console.log('Ficheiro horario.ics criado com sucesso!');
}

Este snippet gera um ficheiro validado que importa direto no Google Calendar. Se você tem muitos alunos ou quer oferecer isso como serviço, é a abordagem mais limpa — sem dependência de APIs externas, sem custos de tokens de IA, sem risco de alucinação de horário.

Erros Comuns (e como evitá-los)

Já vi muita gente — devs incluídos — tropeçar nos mesmos buracos:

  • Não definir TZID: o evento aparece 1 hora adiantado ou atrasado, especialmente na transição do horário de verão. Em Portugal, o switch acontece no último domingo de março e outubro. Use sempre Europe/Lisbon.
  • Esquecer o UNTIL na RRULE: sem isso, o evento repete para sempre. Eu já vi calendário de 2015 ainda criando eventos em 2030 porque alguém importou sem UNTIL.
  • UID duplicado: se você importar o mesmo .ics duas vezes, o Google ignora ou duplica consoante a versão. Gere sempre UIDs determinísticos baseados em (disciplina + dia + hora).
  • Ignorar feriados e pausas letivas: a IA por padrão repete o horário durante o Natal, Carnaval e Páscoa. Você precisa pedir explicitamente para excluir via EXDATE ou limitar a RRULE por trimestre.
  • Importar no calendário principal: erro clássico. Crie sempre um calendário novo, verifique, e só depois defina como visível. Apagar um calendário com 200 eventos duplicados é chato.
  • Confiar cegamente na visão da IA: aulas de 50 minutos vs 60 minutos, salas trocadas, professores abreviados de forma ambígua. Sempre revisar uma amostra.

Alternativas que valem considerar

Google Calendar não é a única opção, embora seja a mais popular em Portugal:

Ferramenta Vantagem Quando usar
Google Calendar Integração com Android, partilha fácil Uso pessoal, partilha com família
Apple Calendar + iCloud Sincronização nativa no iPhone/Mac Ecossistema Apple
Outlook + Microsoft 365 Melhor para contexto corporativo/escolar Escolas que usam Office 365 Education
Nextcloud Calendar Self-hosted, privacidade total Quem preza por dados locais
Trello + Power-Up de calendário Combina tarefas com horários Estudantes que usam GTD/Kanban

Se você é dev e o seu colégio/universidade já usa Google Workspace for Education, parabéns — você tem tudo nativo. Mas se for uma instituição que se importa com LGPD, o Nextcloud é a escolha mais sólida. Eu já implementei para uma escola profissional no Porto e o feedback foi excelente.

Uma camada a mais: automação total com n8n ou Make

Para quem quer ir além, dá para montar um workflow onde:

  1. Uma imagem do horário cai num email ou pasta do Google Drive.
  2. Um trigger no n8n envia a imagem para a API do Gemini.
  3. A resposta é validada por um nó de código JavaScript.
  4. O .ics válido é importado automaticamente via API do Google Calendar.

É overkill para um aluno, mas se você gere uma turma inteira ou uma secretaria escolar, poupa horas por semana. E é um ótimo projeto para mostrar no portfólio, btw.

FAQ — Perguntas que devs realmente fazem

O ficheiro .ics funciona em iPhone?
Sim. Vá a Definições → Mail → Contas → Adicionar Conta → Outros → Adicionar Calendário Subscrevido. Cole a URL pública do calendário ou importe o ficheiro via app Ficheiros.

Posso editar o .ics depois de importar?
Não direto no Google Calendar para eventos recorrentes — você edita a “série”. Para mudar uma ocorrência específica, edita só aquela. Se quiser editar o .ics bruto, apaga todos os eventos do calendário e reimporta.

A IA vê os meus dados pessoais?
Sim. Quando envias a imagem do horário para ChatGPT/Gemini, estás a enviar dados para servidores terceiros. Para dados sensíveis (nome completo, turma, professores), considera gerar o .ics localmente via script — como mostrei acima em Node.js.

Qual é o tamanho máximo de um .ics?
Tecnicamente não há limite duro no RFC 5545, mas na prática, ficheiros acima de 5 MB podem travar importadores. Para um horário escolar, raramente passas de 50 KB.

Funciona com horário quinzenal (semanas A/B)?
Funciona, mas exige cuidado. Você precisa de dois conjuntos de eventos com RRULE distintos e um mecanismo para alternar. A IA geralmente erra isso; eu sempre reviso manualmente as quinzenais.

Vale a pena usar apps tipo “Timetastic” ou “iStudiez”?
Para estudantes que querem tudo mastigado, sim. Para devs, não — perdemos o controle do formato e ficamos reféns da app. Prefiro .ics puro.

Considerações finais

Na minha rotina, transformei este processo num script que roda uma vez por trimestre. Custa-me 5 minutos configurar e o resto do período letivo está sincronizado em três dispositivos. O segredo não é a IA — é a validação humana depois. Confiar 100% na alucinação inevitável dos modelos é o erro que paga caro.

Se você é dev e está a automatizar isto para uma escola, lembra-te: exporta sempre uma API, não um .ics estático. O .ics é o entregável final, mas o sistema deve permitir regenerar quando o horário muda — e em Portugal, muda sempre duas ou três vezes por ano letivo.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.