¿Por qué los días laborables de Excel son incorrectos para 1900?

27

Esta pregunta se basa en las observaciones de AdamV en su respuesta sobre ¿Cómo obtengo el nombre del día en una celda en Excel?

Cuando A1 tiene el valor 2009-08-01, entonces:

  • =WEEKDAY(A1) obtendrá 7
  • =TEXT(7, "dddd") obtendrá Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") obtendrá Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") obtendrá Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") también obtendrá Sunday, 1900-01-01

Los dos últimos están equivocados: el 1 de enero de 1900 es en realidad un lunes.
Varias fuentes parecen confirmar que:

¿Qué me estoy perdiendo? ¿Por qué Excel está haciendo esto mal?

Jeroen Wiert Pluimers
fuente
1
Gracias a esta pregunta, he modificado ligeramente mi respuesta anterior para dejar en claro que el 1/1/1900 no es domingo, pero Excel cree que sí. La inexactitud no cambia la sustancia de esa respuesta anterior, que es que usar un número de día de la semana como base para producir texto formateado para que parezca una fecha es defectuoso e innecesario.
AdamV

Respuestas:

40

Como se describe en Microsoft KB 214058 :

Los días de la semana anteriores al 1 de marzo de 1900 son incorrectos en Excel

MÁS INFORMACIÓN

Cuando se creó originalmente el sistema de fechas en Microsoft Excel, fue diseñado para ser totalmente compatible con los sistemas de fechas utilizados por otros programas de hojas de cálculo.

Sin embargo, en este sistema de fechas, el año 1900 se interpreta incorrectamente como un año bisiesto. Debido a que no hay 29 de febrero ("día bisiesto") en el año 1900, el día de la semana para cualquier fecha anterior al 1 de marzo de 1900 (el día posterior al "día bisiesto") no se calcula correctamente.

Los "otros programas de hoja de cálculo" se refieren a Lotus 1-2-3 , que era bastante popular en aquel entonces, y suponía incorrectamente que el año 1900 era bisiesto. Esto se explica con aún más detalle en KB 214326 :

Excel 2000 supone incorrectamente que el año 1900 es bisiesto

MÁS INFORMACIÓN

Cuando se lanzó Lotus 1-2-3 por primera vez, el programa asumió que el año 1900 era bisiesto, aunque en realidad no fue un año bisiesto. Esto facilitó que el programa maneje los años bisiestos y no causó daños a casi todos los cálculos de fechas en Lotus 1-2-3.

Cuando se lanzaron Microsoft Multiplan y Microsoft Excel, también asumieron que 1900 era un año bisiesto. Esta suposición permitió a Microsoft Multiplan y Microsoft Excel utilizar el mismo sistema de fecha de serie que Lotus 1-2-3 y proporcionar una mayor compatibilidad con Lotus 1-2-3. Tratar 1900 como un año bisiesto también facilitó a los usuarios mover las hojas de trabajo de un programa a otro.

Aunque es técnicamente posible corregir este comportamiento para que las versiones actuales de Microsoft Excel no asuman que 1900 es un año bisiesto, las desventajas de hacerlo superan las ventajas.

Si se corrigiera este comportamiento, surgirían muchos problemas, incluidos los siguientes:

  • Casi todas las fechas en las hojas de trabajo actuales de Microsoft Excel y otros documentos se reducirían en un día. Corregir este cambio llevaría mucho tiempo y esfuerzo, especialmente en fórmulas que usan fechas.
  • Algunas funciones, como la función WEEKDAY, devolverían valores diferentes; Esto puede hacer que las fórmulas en las hojas de trabajo funcionen incorrectamente.
  • Corregir este comportamiento rompería la compatibilidad de fecha de serie entre Microsoft Excel y otros programas que usan fechas.

Si el comportamiento no se corrige, solo se produce un problema:

  • La función WEEKDAY devuelve valores incorrectos para fechas anteriores al 1 de marzo de 1900. Debido a que la mayoría de los usuarios no usan fechas anteriores al 1 de marzo de 1900, este problema es raro.
Gravedad
fuente
10
Aquí hay una historia relacionada de Joel Spolsky de Stack Exchange: joelonsoftware.com/items/2006/06/16.html
mate
55
Ver también . Muchos programadores suponen incorrectamente que trabajar con fechas / horas es fácil :)
BlueRaja - Danny Pflughoeft
3
NitpicK histórico: cuando dice que 1-2-3 era "bastante popular", quiere decir que alguna vez fue la hoja de cálculo dominante.
Isaac Rabinovitch
12

Aquí está la razón explicada por el propio Joel: Mi primera revisión de BillG

Basic utiliza el 31 de diciembre de 1899 como la época en lugar del 1 de enero de 1900, pero por alguna razón, la fecha de hoy era la misma en Excel que en Basic.

¿Eh?

Fui a buscar un desarrollador de Excel que tuviera la edad suficiente para recordar por qué. Ed Fries parecía saber la respuesta.

"Oh", me dijo. "Echa un vistazo al 28 de febrero de 1900."

"Son 59", dije.

"Ahora intenta el 1 de marzo".

"¡Son 61!"

"¿Qué pasó con 60?" Preguntó Ed.

"29 de febrero. ¡1900 fue un año bisiesto! ¡Es divisible por 4!"

"Buena suposición, pero sin cigarro", dijo Ed, y me dejó preguntándome por un rato.

Ups Investigué un poco. Los años que son divisibles por 100 no son años bisiestos, a menos que también sean divisibles por 400.

1900 no fue un año bisiesto.

"¡Es un error en Excel!" Exclamé

"Bueno, en realidad no", dijo Ed. "Tuvimos que hacerlo de esa manera porque necesitamos poder importar hojas de trabajo Lotus 123".

"Entonces, ¿es un error en Lotus 123?"

"Sí, pero probablemente sea intencional. Lotus tuvo que caber en 640K. Eso no es mucha memoria. Si ignoras 1900, puedes averiguar si un año dado es bisiesto solo mirando para ver si los dos bits más a la derecha son cero. Eso es realmente rápido y fácil. Los chicos de Lotus probablemente pensaron que no importaba estar equivocado durante esos dos meses en el pasado.

Giorgi
fuente
1
@JeroenWiertPluimers: En realidad, mi respuesta con este enlace fue eliminada por el moderador y decidí ampliar mi respuesta.
Giorgi
2

Una solución a esto es agregar 400 años al año, para calcular el día de la semana como en la siguiente fórmula = DÍA DE LA SEMANA (FECHA (A4 + 400, B4, C4), 1) así que si A4 = 1834 B4 = 12 C4 = 14 esto devolvería 1 (domingo) que es lo mismo que para el 14 de diciembre de 2234 Esto deja de funcionar para fechas anteriores a 1753 el año posterior al cambio al calendario gregoriano

Adrian
fuente