Sobre anos bissextos e por que eles existem
A Terra não leva exatamente 365 dias para dar a volta ao Sol. O tempo real de translação é cerca de 365,2422 dias. Se a gente ignorasse essa fração, o calendário acumularia um erro de quase um dia inteiro a cada quatro anos. Depois de alguns séculos, coisas como o equinócio de março começariam a migar para fevereiro, e o sistema inteiro perderia coerência com as estações. O ano bissexto é o ajuste que corrige esse desvio.
oq é um ano bissexto
Um ano bissexto é aquele que tem 366 dias em vez dos 365 habituais, com um dia extra adicionado em fevereiro (29 de fevereiro). A regra básica diz que qualquer ano divisível por 4 é bissexto — mas existem exceções importantes que a maioria dos tutoriais sensacionalistas deixa de mencionar. Um ano divisível por 100 só é bissexto se também for divisível por 400. Isso significa que 1900 não foi bissexto, mas 2000 foi. A lógica é manter a média do calendário gregoriano dentro de 26 segundos de erro por ano em relação ao ano trópico real, que é uma impressionante para algo que nasceu em 1582. Aqui vai algo que pouca gente sabe: o sistema gregoriano na verdade sobrecorrigi ligeiramente. A média dele é de 365,2425 dias, enquanto o ano trópico atual (em 2024) mede aproximadamente 365,24219 dias. Isso gera um excesso de cerca de 0,0003 dias por ano. Em termos práticos, estamos adicionando um dia extra a mais de 3.300 em relação ao necessário. Dentro de milênios, o calendário pode precisar de uma revisão, mas isso está tão fora do horizonte operacional que ninguém no setor se preocupa com isso hoje.
Na prática, lidar com anos bissextos em software é onde a coisa fica chata. Eu passei semanas depurando um sistema de agendamento em 2019 que falhava intermitentemente em 2020. O problema era um módulo legado que calculava datas usando a função `dayOfYear` e assumia implicitamente que fevereiro tinha 28 dias em todos os anos. Quando 29 de fevereiro apareceu, ele simplesmente ignorava o dia e incrementava o mês equivocadoamente, fazendo com que relatórios trimestrais desalinhados mostrassem datas como 31 de fevereiro, que bibliotecas mais rigorosas convertiam para 2 de março. A correção foi replacing a lógica manual de contagem de dias por chamadas diretas à biblioteca padrão do sistema com suporte a ano bissexto integrado. Outro problema comum e muito menos óbvio: tabelas SQL com colunas do tipo DATE que têm constraints de verificação mal configuradas podem rejeitar 29 de fevereiro de anos bissextos se o banco de dados estiver em modo de strict mode e a constraint exigir implicitamente dias válidos em meses de 28 dias. Isso não é hipotético — vi dois bancos de dados de instituições financeiras com esse defeito em produção. A solução depende do SGBD, mas geralmente envolve ajustar a constraint ou migrar para um tipo TIMESTAMP com timezone, que lida com dias extras de forma nativa.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Se você está implementando a lógica do zero e precisa verificar se um ano é bissexto sem confiar em bibliotecas, o algoritmo correto é: ano % 4 == 0 && (ano % 100 != 0 || ano % 400 == 0)
Nota importante: usar apenas `ano % 4 == 0` é o erro mais frequente em entrevistas técnicas e em código de produção mal revisado. Ele funciona para a maioria dos anos comuns, mas quebra silenciosamente em anos como 1900, 2100, 2200 e 2300, que são múltiplos de 4 mas não de 400 após serem múltiplos de 100. Não existe uma biblioteca universal que resolva todas as nuances, porque diferentes calendários (juliano, islâmico, hebraico, hindu) têm regras completamente distintas para anos bissextos. Se o seu projeto lida com múltiplos calendários, use uma biblioteca especializada como a JSR 310 (Java Time API) ou a biblioteca `datetime` do Python, que já implementam essas regras internamente e são testadas contra benchmarks internacionais. Evite escrever sua própria implementação de calendário a menos que tenha razões muito específicas para isso.
O calendário gregoriano foi adotado gradualmente entre 1582 e 1929, dependendo do país. A Rússia só adotou em 1918, e a Grécia em 1923. Isso significa que datas históricas antes dessa adoção em determinada região podem mostrar inconsistências se você converter entre o estilo antigo (juliano) e o novo (gregoriano) sem cuidado. Para pesquisas históricas ou genealógicas, isso é um problema real que causa erros de cálculo de idade e cronologias.