Por que os dias da semana do Excel estão errados em 1900?

27

Esta pergunta é baseada nas observações de AdamV em sua resposta em Como faço para obter o nome do dia em uma célula no Excel?

Quando A1 tiver o valor 01/08/2009, então:

  • =WEEKDAY(A1) obterá 7
  • =TEXT(7, "dddd") obterá Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") obterá Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") obterá Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") também obterá Sunday, 1900-01-01

Os dois últimos estão errados: o 1º de janeiro de 1900 é na verdade uma segunda-feira.
Várias fontes parecem confirmar que:

o que estou perdendo? Por que o Excel está fazendo isso errado?

Jeroen Wiert Pluimers
fonte
1
Graças a esta pergunta, reformulei levemente minha resposta anterior para deixar claro que 1/1/1900 não é domingo, mas o Excel pensa que é. A imprecisão não altera a substância da resposta anterior, que é a de que usar um número de dia da semana como base para produzir texto formatado para parecer uma data é imperfeito e desnecessário.
AdamV

Respostas:

40

Conforme descrito no Microsoft KB 214058 :

Dias da semana antes de 1º de março de 1900 estão incorretos no Excel

MAIS INFORMAÇÕES

Quando o sistema de datas no Microsoft Excel foi criado, ele foi projetado para ser totalmente compatível com os sistemas de datas usados ​​por outros programas de planilha.

No entanto, nesse sistema de datas, o ano de 1900 é incorretamente interpretado como um ano bissexto. Como não há 29 de fevereiro ("dia bissexto") no ano de 1900, o dia da semana em qualquer data anterior a 1º de março de 1900 (o dia após o "dia bissexto") não é computado corretamente.

Os "outros programas de planilhas" se referem ao Lotus 1-2-3 , que era bastante popular na época, e supunha incorretamente que o ano de 1900 era um ano bissexto. Isso é explicado com ainda mais detalhes no KB 214326 :

O Excel 2000 assume incorretamente que o ano de 1900 é um ano bissexto

MAIS INFORMAÇÕES

Quando o Lotus 1-2-3 foi lançado pela primeira vez, o programa assumiu que o ano de 1900 era um ano bissexto, embora na verdade não fosse um ano bissexto. Isso tornou mais fácil para o programa lidar com anos bissextos e não causou danos a quase todos os cálculos de data no Lotus 1-2-3.

Quando o Microsoft Multiplan e o Microsoft Excel foram lançados, eles também assumiram que 1900 foi um ano bissexto. Essa suposição permitiu que o Microsoft Multiplan e o Microsoft Excel usassem o mesmo sistema de datas seriais usado pelo Lotus 1-2-3 e forneçam maior compatibilidade com o Lotus 1-2-3. Tratar 1900 como um ano bissexto também tornou mais fácil para os usuários moverem planilhas de um programa para outro.

Embora seja tecnicamente possível corrigir esse comportamento para que as versões atuais do Microsoft Excel não assumam que 1900 seja um ano bissexto, as desvantagens de fazer isso superam as vantagens.

Se esse comportamento fosse corrigido, muitos problemas surgiriam, incluindo o seguinte:

  • Quase todas as datas nas planilhas atuais do Microsoft Excel e outros documentos seriam reduzidas em um dia. Corrigir essa mudança levaria tempo e esforço consideráveis, especialmente em fórmulas que usam datas.
  • Algumas funções, como a função WEEKDAY, retornariam valores diferentes; isso pode fazer com que as fórmulas nas planilhas funcionem incorretamente.
  • A correção desse comportamento quebraria a compatibilidade de datas seriais entre o Microsoft Excel e outros programas que usam datas.

Se o comportamento permanecer não corrigido, apenas um problema ocorrerá:

  • A função WEEKDAY retorna valores incorretos para datas anteriores a 1º de março de 1900. Como a maioria dos usuários não usa datas anteriores a 1º de março de 1900, esse problema é raro.
gravidade
fonte
10
Aqui está uma história relacionada do próprio Joel Spolsky do Stack Exchange: joelonsoftware.com/items/2006/06/16.html
matt
5
Veja também . Muitos programadores assumem incorretamente que trabalhar com datas / horas é fácil :)
BlueRaja - Danny Pflughoeft
3
NitpicK histórico: quando você diz que 1-2-3 foi "bastante popular", você quer dizer que já foi a planilha dominante.
Isaac Rabinovitch
12

Aqui está o motivo explicado pelo próprio Joel: My First BillG Review

O Basic usa 31 de dezembro de 1899 como época em vez de 1 de janeiro de 1900, mas, por algum motivo, a data de hoje era a mesma no Excel e no Basic.

Hã?

Fui procurar um desenvolvedor do Excel que tivesse idade suficiente para lembrar o porquê. Ed Fries parecia saber a resposta.

"Oh", ele me disse. "Confira 28 de fevereiro de 1900."

"São 59", eu disse.

"Agora tente 1º de março."

"São 61!"

"O que aconteceu com os 60?" Ed perguntou.

"29 de fevereiro. 1900 foi um ano bissexto! É divisível por 4!"

"Bom palpite, mas sem charuto", disse Ed, e me deixou pensando por um tempo.

Opa Eu fiz algumas pesquisas. Anos divisíveis por 100 não são bissextos, a menos que também sejam divisíveis por 400.

1900 não foi um ano bissexto.

"É um bug no Excel!" Eu exclamei.

"Bem, na verdade não", disse Ed. "Tivemos que fazer dessa maneira, porque precisamos poder importar as planilhas do Lotus 123".

"Então, é um bug no Lotus 123?"

"Sim, mas provavelmente intencional. A Lotus tinha que caber em 640K. Isso não é muita memória. Se você ignorar 1900, poderá descobrir se um determinado ano é um ano bissexto apenas olhando para ver se os dois bits mais à direita são zero. Isso é muito rápido e fácil.Os funcionários da Lotus provavelmente pensaram que não importava estar errado nesses dois meses no passado.

Giorgi
fonte
1
@JeroenWiertPluimers: Na verdade, minha resposta com este link foi excluída pelo moderador e eu decidi expandir minha resposta.
Giorgi
2

Uma solução para isso é adicionar 400 anos ao ano, calcular o dia da semana como na seguinte fórmula = WEEKDAY (DATA (A4 + 400, B4, C4), 1), portanto, se A4 = 1834 B4 = 12 C4 = 14 isso retornaria 1 (domingo), igual a 14 de dezembro de 2234. Isso deixa de funcionar para datas anteriores a 1753, no ano seguinte à mudança no calendário gregoriano

Adrian
fonte