Problema de ano bissexto - Leap year problem

O problema do ano bissexto (também conhecido como bug do ano bissexto ou bug do dia bissexto ) é um problema para documentação digital (relacionada ao computador) e não digital e situações de armazenamento de dados que resulta de erros no cálculo de quais anos são bissextos anos , ou de manipulação de datas sem levar em conta a diferença entre anos bissextos e anos comuns.

Categorias

Os bugs de ano bissexto normalmente se enquadram em duas categorias, com base na quantidade de impacto que podem ter no uso no mundo real:

  1. Aqueles que levam a condições de erro, como exceções, códigos de retorno de erro, variáveis ​​não inicializadas ou loops infinitos
  2. Aqueles que levam a dados incorretos, como problemas individuais em consultas de intervalo ou agregação

Exemplos

Pitão

O código Python a seguir é um exemplo de bug de ano bissexto de Categoria 1. Ele funcionará corretamente até todayse tornar 29 de fevereiro. Em seguida, tentará criar um 29 de fevereiro de um ano comum, que não existe. O dateconstrutor emitirá um ValueErrorcom a mensagem "o dia está fora do intervalo do mês".

from datetime import date
today = date.today()
later = today.replace(year = today.year + 1)

Windows C ++

O código do Windows C ++ a seguir é um exemplo de um bug de ano bissexto de Categoria 1. Ele funcionará corretamente até stse tornar 29 de fevereiro. Em seguida, tentará criar um 29 de fevereiro de um ano comum, que não existe. Passar isso para qualquer função que aceite uma SYSTEMTIMEestrutura provavelmente falhará.

Por exemplo, a SystemTimeToFileTimechamada mostrada aqui retornará um código de erro. Uma vez que esse valor de retorno está desmarcado (o que é extremamente comum), isso resultará em não ftser inicializado.

SYSTEMTIME st;
FILETIME ft;

GetSystemTime(&st);
st.wYear++;

SystemTimeToFileTime(&st, &ft);

Microsoft C #

O código .NET C # a seguir é um exemplo de bug de ano bissexto de Categoria 1. Ele funcionará corretamente até dtse tornar 29 de fevereiro. Em seguida, tentará criar um 29 de fevereiro de um ano comum, que não existe. O DateTimeconstrutor lançará um ArgumentOutOfRangeException.

DateTime dt = DateTime.Now;
DateTime result = new DateTime(dt.Year + 1, dt.Month, dt.Day);

JavaScript

O código JavaScript a seguir é um exemplo de bug de ano bissexto de Categoria 2. Ele funcionará corretamente até o dtdia 29 de fevereiro, como em 29/02/2020. Em seguida, ele tentará definir o ano como 2021. Como 2021-02-29 não existe, o Dateobjeto avançará para a próxima data válida, que é 2021-03-01.

var dt = new Date();
dt.setFullYear(dt.getFullYear() + 1);

Algoritmo de ano bissexto ruim (muitos idiomas)

O código a seguir é um exemplo de um bug de ano bissexto que é visto em muitos idiomas. Isso pode causar um impacto de Categoria 1 ou Categoria 2, dependendo da finalidade do resultado. Ele assume incorretamente que um ano bissexto ocorre exatamente a cada quatro anos.

bool isLeapYear = year % 4 == 0;

O algoritmo de ano bissexto correto é explicado em Algoritmo de ano bissexto .

Ocorrências

Houve muitas ocorrências de bugs de ano bissexto:

  • O Microsoft Excel tem, desde suas versões mais antigas, considerado incorretamente 1900 como um ano bissexto e, portanto, 29 de fevereiro ocorre entre 28 de fevereiro e 1º de março daquele ano. O bug originou-se do Lotus 1-2-3 e foi implementado propositalmente no Excel para fins de compatibilidade com versões anteriores . A Microsoft escreveu um artigo sobre esse bug, explicando os motivos para tratar 1900 como um ano bissexto. Este bug foi promovido a um requisito na especificação Ecma Office Open XML (OOXML).
  • Em 1996, duas fábricas de fundição de alumínio em Tiwai Point , Nova Zelândia, e Bell Bay , Tasmânia, Austrália, experimentaram um bug de ano bissexto em 31 de dezembro, quando cada um dos 660 computadores que controlavam as linhas de cubas de fundição desligou ao bater da meia-noite simultaneamente e sem aviso. Os computadores não foram programados para lidar com o 366º dia do ano. Os custos de reparo foram estimados em mais de NZ $ 1 milhão .
  • À meia-noite de 31 de dezembro de 2008, muitos modelos do Zune 30 da primeira geração congelaram. A Microsoft afirmou que o problema foi causado pelo driver de relógio interno desenvolvido pela Freescale e a forma como o dispositivo lida com um ano bissexto . Ele se consertou automaticamente 24 horas depois, mas uma "correção" intermediária para aqueles que não queriam esperar era drenar a bateria do dispositivo e recarregar após o meio-dia UTC em 1º de janeiro de 2009.
  • O PlayStation 3 da Sony tratou incorretamente 2010 como um ano bissexto, então o inexistente 29 de fevereiro de 2010 foi mostrado em 1º de março de 2010 e causou um erro no programa .
  • Em 2012, os dispositivos de navegação por satélite TomTom apresentaram mau funcionamento devido a um bug de ano bissexto que surgiu pela primeira vez em 31 de março.
  • Em 2012, o histórico de bate-papo do Gmail exibia a data 31 de dezembro de 1969, para todos os bate-papos salvos em 29 de fevereiro .
  • Em 2012, o Microsoft Azure foi colocado offline pelo bug do ano bissexto em 28 de fevereiro. Às 17:45 PST, a equipe do Windows Azure tomou conhecimento de um problema, aparentemente devido a um cálculo de tempo que estava incorreto para o ano bissexto.
  • Em 2016, um grande número de bugs de ano bissexto foram catalogados na Lista de Bugs de Dia Bissexto de 2016 no site Code of Matt .
  • Em 2016, um bug de ano bissexto no sistema de transporte de bagagem do aeroporto de Düsseldorf em 29 de fevereiro fez com que mais de 1.200 bagagens perdessem seus voos.
  • Em 2020, um grande número de bugs de ano bissexto foram catalogados na Lista de Erros de Dia Bissexto de 2020 no site Code of Matt .

Veja também

Referências