28 votos

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

Esta pregunta se basa en las observaciones de AdamV en su respuesta en ¿Cómo puedo introducir el nombre del día en una celda de 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 confirmarlo:

¿Qué me falta? ¿Por qué Excel lo hace mal?

1 votos

Gracias a esta pregunta he reformulado ligeramente mi respuesta anterior para dejar claro que el 1/1/1900 no es un domingo, pero Excel cree que lo es. La inexactitud no cambia la esencia de esa respuesta anterior, que es que el uso de un número de día de la semana como base para producir un texto formateado para parecer una fecha es defectuoso e innecesario.

42voto

Nick Dixon Puntos 154

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ó el sistema de fechas de Microsoft Excel, se diseñó para que fuera 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. Como 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 aquella época, y asumió incorrectamente que el año 1900 era bisiesto. Esto se explica con más detalle en KB 214326 :

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

MÁS INFORMACIÓN

Cuando Lotus 1-2-3 fue lanzado por primera vez, el programa asumió que el año 1900 era un año bisiesto, aunque en realidad no lo era. Esto facilitaba al programa el manejo de los años bisiestos y no perjudicaba 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 a Microsoft Excel utilizar el mismo sistema de fechas en serie utilizado por Lotus 1-2-3 y proporcionar una mayor compatibilidad con Lotus 1-2-3. El tratamiento de 1900 como año bisiesto también facilitó a los usuarios el traslado de 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, entre ellos los siguientes:

  • Casi todas las fechas de las hojas de cálculo actuales de Microsoft Excel y otros documentos se reducirían en un día. Corregir este desplazamiento llevaría mucho tiempo y esfuerzo, especialmente en las fórmulas que utilizan fechas.
  • Algunas funciones, como la función WEEKDAY, devolverían valores diferentes; esto podría hacer que las fórmulas en las hojas de trabajo funcionaran incorrectamente.
  • Corregir este comportamiento rompería la compatibilidad de fechas en serie entre Microsoft Excel y otros programas que utilizan fechas.

Si el comportamiento sigue sin corregirse, sólo se produce un problema:

  • La función WEEKDAY devuelve valores incorrectos para fechas anteriores al 1 de marzo de 1900. Como la mayoría de los usuarios no utilizan fechas anteriores al 1 de marzo de 1900, este problema es poco frecuente.

10 votos

Aquí hay una historia relacionada del propio Joel Spolsky de Stack Exchange: joelonsoftware.com/items/2006/06/16.html

5 votos

Ver también . Muchos programadores asumen erróneamente que trabajar con fechas/horas es fácil :)

3 votos

NitpicK histórico: cuando dices que 1-2-3 era "bastante popular" te refieres a que en su día fue la hoja de cálculo dominante.

13voto

bhagyas Puntos 101

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 é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 a un desarrollador de Excel que tuviera la edad suficiente para recordar por qué. Ed Fries parecía saber la respuesta.

"Oh", me dijo. "Mira el 28 de febrero de 1900".

"Son 59", dije.

"Ahora intenta el 1 de marzo".

"¡Es el 61!"

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

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

"Buena suposición, pero no hay cigarro", dijo Ed, y me dejó pensando por un un rato.

Oops. He investigado 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 de Excel!" exclamé.

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

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

"Sí, pero probablemente de forma intencionada. Lotus tenía que caber en 640K. Eso no es mucha memoria. Si ignoras 1900, puedes averiguar si un año dado es un año bisiesto simplemente mirando si los dos bits de la derecha dos bits son cero. Eso es realmente rápido y fácil. Los chicos de Lotus probablemente pensaron que no importaba equivocarse en esos dos meses en el pasado.

1 votos

@JeroenWiertPluimers: En realidad mi respuesta con este enlace fue borrada por el moderador y decidí ampliar mi respuesta.

2voto

Adrian Puntos 21

Una solución a esto es añadir 400 años al año, para calcular el día de la semana como en la siguiente fórmula:

=WEEKDAY(DATE(A4+400,B4,C4),1)

Por lo tanto, las siguientes variables

A4 = 1834
B4 = 12
C4 = 14

volvería 1 (domingo), que es el mismo que el del 14 de diciembre de 2234.
Esto deja de funcionar para las fechas anteriores a 1753 El año siguiente al cambio del calendario gregoriano.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: