Perché i giorni feriali di Excel sono errati per il 1900?


27

Questa domanda si basa sulle osservazioni di AdamV nella sua risposta su Come ottenere il nome del giorno in una cella in Excel?

Quando A1 ha il valore 2009-08-01, quindi:

  • =WEEKDAY(A1) otterrà 7
  • =TEXT(7, "dddd") otterrà Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") otterrà Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") otterrà Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") otterrà anche Sunday, 1900-01-01

Gli ultimi due sono sbagliati: il 1 ° gennaio 1900 è in realtà un lunedì.
Varie fonti sembrano confermare che:

Cosa mi sto perdendo? Perché Excel sta facendo questo male?


1
Grazie a questa domanda ho leggermente riformulato la mia risposta precedente per chiarire che 1/1/1900 non è una domenica, ma Excel pensa che lo sia. L'inesattezza non cambia la sostanza di quella risposta precedente, ovvero l'uso di un numero del giorno della settimana come base per produrre un testo formattato in modo da sembrare una data è imperfetto e non necessario.
AdamV,

Risposte:


40

Come descritto in Microsoft KB 214058 :

I giorni della settimana prima del 1 marzo 1900 non sono corretti in Excel

MAGGIORI INFORMAZIONI

Quando il sistema di data in Microsoft Excel è stato originariamente creato, è stato progettato per essere pienamente compatibile con i sistemi di data utilizzati da altri programmi di fogli di calcolo.

Tuttavia, in questo sistema di data, l'anno 1900 viene erroneamente interpretato come un anno bisestile. Perché non esiste un 29 febbraio ("giorno bisestile") nell'anno 1900, il giorno della settimana per qualsiasi data precedente al 1 marzo 1900 (il giorno successivo al "giorno bisestile"), non viene calcolato correttamente.

Gli "altri programmi per fogli di calcolo" si riferiscono a Lotus 1-2-3 , che all'epoca era piuttosto popolare e presumibilmente erroneamente considerato che l'anno 1900 fosse un anno bisestile. Questo è spiegato in modo ancora più dettagliato in 214326 KB :

Excel 2000 presuppone erroneamente che l'anno 1900 sia un anno bisestile

MAGGIORI INFORMAZIONI

Quando Lotus 1-2-3 fu pubblicato per la prima volta, il programma supponeva che l'anno 1900 fosse un anno bisestile, anche se in realtà non era un anno bisestile. Ciò ha reso più semplice per il programma la gestione degli anni bisestili e non ha causato danni a quasi tutti i calcoli della data in Lotus 1-2-3.

Quando sono stati rilasciati Microsoft Multiplan e Microsoft Excel, hanno anche ipotizzato che il 1900 fosse un anno bisestile. Questo presupposto ha consentito a Microsoft Multiplan e Microsoft Excel di utilizzare lo stesso sistema di data seriale utilizzato da Lotus 1-2-3 e fornire una maggiore compatibilità con Lotus 1-2-3. Il trattamento del 1900 come un anno bisestile ha inoltre reso più semplice per gli utenti spostare i fogli di lavoro da un programma all'altro.

Sebbene sia tecnicamente possibile correggere questo comportamento in modo che le attuali versioni di Microsoft Excel non assumano che 1900 sia un anno bisestile, gli svantaggi di farlo superano i vantaggi.

Se questo comportamento dovesse essere corretto, sorgerebbero molti problemi, tra cui:

  • Quasi tutte le date negli attuali fogli di lavoro di Microsoft Excel e in altri documenti verrebbero ridotte di un giorno. Correggere questo spostamento richiederebbe molto tempo e sforzi, specialmente nelle formule che usano le date.
  • Alcune funzioni, come la funzione WEEKDAY, restituiscono valori diversi; ciò potrebbe causare il malfunzionamento delle formule nei fogli di lavoro.
  • La correzione di questo comportamento comprometterebbe la compatibilità della data seriale tra Microsoft Excel e altri programmi che utilizzano le date.

Se il comportamento rimane non corretto, si verifica un solo problema:

  • La funzione WEEKDAY restituisce valori errati per le date precedenti al 1 marzo 1900. Poiché la maggior parte degli utenti non utilizza date precedenti al 1 marzo 1900, questo problema è raro.

10
Ecco una storia correlata dal Joel Spolsky di Stack Exchange: joelonsoftware.com/items/2006/06/16.html
matt

5
Guarda anche . Molti programmatori presumono erroneamente che lavorare con date / orari sia facile :)
BlueRaja - Danny Pflughoeft

3
Storico nitpicK: quando dici che 1-2-3 era "abbastanza popolare" intendi dire che una volta era il foglio di calcolo dominante.
Isaac Rabinovitch,

12

Ecco il motivo spiegato dallo stesso Joel: My First BillG Review

Basic usa il 31 dicembre 1899 come epoca invece del 1 gennaio 1900, ma per qualche ragione, la data odierna era la stessa in Excel come era in Basic.

Eh?

Sono andato a trovare uno sviluppatore di Excel che fosse abbastanza grande da ricordare il perché. Ed Fries sembrava conoscere la risposta.

"Oh", mi disse. "Dai un'occhiata al 28 febbraio 1900."

"Sono 59", dissi.

"Ora prova il 1 ° marzo."

"Sono 61!"

"Che cosa è successo a 60?" Chiese Ed.

"29 febbraio. 1900 è stato un anno bisestile! È divisibile per 4!"

"Indovina, ma niente sigaro," disse Ed e mi lasciò per un po 'a chiedermi.

Ops. Ho fatto delle ricerche. Gli anni che sono divisibili per 100 non sono anni bisestili, a meno che non siano anche divisibili per 400.

Il 1900 non è stato un anno bisestile.

"È un bug in Excel!" Ho esclamato.

"Beh, non proprio" disse Ed. "Abbiamo dovuto farlo in questo modo perché dobbiamo essere in grado di importare fogli di lavoro Lotus 123".

"Quindi, è un bug in Lotus 123?"

"Sì, ma probabilmente intenzionale. Lotus doveva adattarsi a 640 K. Non è un sacco di memoria. Se ignori il 1900, puoi capire se un determinato anno è un anno bisestile solo cercando di vedere se i due bit più giusti sono zero. È davvero veloce e facile. I ragazzi di Lotus probabilmente hanno pensato che non importava essere sbagliato per quei due mesi in passato.


1
@JeroenWiertPluimers: in realtà la mia risposta con questo link è stata cancellata dal moderatore e ho deciso di espandere la mia risposta.
Giorgi,

2

Una soluzione a questo è aggiungere 400 anni all'anno, per elaborare il giorno della settimana come nella seguente formula = WEEKDAY (DATE (A4 + 400, B4, C4), 1) quindi se A4 = 1834 B4 = 12 C4 = 14 questo restituirebbe 1 (domenica) che è lo stesso del 14 dicembre 2234. Questo smette di funzionare per date precedenti al 1753 l'anno successivo alla modifica del calendario gregoriano

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.