El tiempo de Microsoft

Hace tiempo Juan me envió dos enlaces (Fabulous Adventures In Coding: Eric’s Complete Guide to VT_DATE y Joel on software: My First BillG Review) que representan una muestra de las dificultades con las que un programador tienen que bregar en ocasiones debido a nefastos diseños que pueden haberse llegado a enquistar eternamente con la excusa de mantener compatibilidades. En este caso, los dos textos se refieren al formato interno de representación de fecha que usa OLE Automation (para los legos, uno de los mecanismos más extendidos de comunicación entre aplicaciones de Windows) y describen sus incongruencias en un tono jocoso. Lo que sigue es un resumen también informal. Para otro día quedan las descripciones de otros formatos de tiempo usados en informática, por suerte algo más coherentes.
Remontémonos a finales de los ochenta. En el terreno de la ofimática se estaba librando una batalla entre las empresas Microsoft y Lotus. La segunda ofrecía la hoja de cálculo más popular hasta el momento, Lotus 1-2-3, papel que ambicionaba Excel. Cuando la compañía de Bill Gates desarrolló esta aplicación quiso asegurarse de que su software era capaz de importar los documentos existentes de su rival. Y con ello heredó un formato de tiempo que se había concebido con bastante anterioridad para equipos muy excasos de memoria, apenas 640Kb. Para hacernos una idea, hoy día cualquier fotografía digital, comprimida, ocupa varias veces este tamaño. Con todo, no parece excusa que justifique suficientemente un formato tan surrealista.
Para OLE Automation el tiempo se representa internamente como un número real. La parte entera indica el número de días transcurridos desde la medianoche del 30 al 31 de diciembre de 1899. La parte fraccionaria, las horas y minutos. No se hace referencia a zonas horarias, ni a horarios de verano. Imagine el lector que una oficina en Santa Cruz de Tenerife tuviera que compartir información relativa al tiempo con otra en Caracas y empezará a comprender las implicaciones. O que almacenase información, y un día al año las dos y media de la mañana acaeciesen antes que las dos en punto. Las especificaciones no detallan cómo dividir la parte fraccionaria los días que tienen 23 o 25 horas. Pues bien, buena parte del software que se ejecuta hoy en un sistema Windows emplea este método de representación de tiempo. Pero las rarezas no han hecho sino empezar.
Un número en coma flotante tiene distinta exactitud según su tamaño. Esto implica que las fechas cercanas a 1900, según el tiempo VT_DATE, alcanzarán gran precisión al determinar las fracciones de segundo. Sin embargo, conforme nos alejemos de este año iremos perdiéndola progresivamente. Y si es hacia el pasado el efecto puede ser más catastrófico. Al aproximarnos a las doce de la noche llegará un momento en que el ordenador deba efectuar un redondeo, y lo hará hacia el entero más cercano, menor. Pero la parte fraccionaria del día se cuenta hacia adelante en el tiempo. Lo que quiere decir que incurrirá con esta aproximación en un error de un día; eso con apenas avanzar una fracción de segundo. Eric Lippert sigue comentando más incoherencias: se podría pensar que, puesto que la parte entera de un número es, como se ha dicho, el número de días transcurridos desde una determinada fecha, para saber los que median entre dos momentos cualesquiera basta con restar. No se puede hacer tan a la ligera. Los valores -0.75 y 0.75 representan el mismo instante: las seis de la tarde del 30 de diciembre de 1899. El formato asocia al mismo día dos números diferentes (se podría decir que cuenta dos veces el cero). Si la diferencia se realiza entre dos valores negativos también se puede incurrir en un día de error. Por otro lado, el 60 representa el día 29 de diciembre de 1900, fecha inexistente, pues dicho año no fue bisiesto. Esto último explica por qué se eligió como momento de inicio en este formato la medianoche del 30 al 31, y no el cambio de año.
Joel Spolsky comenta que, cuando fue preguntado por Bill Gates acerca de si Basic conservaría compatibilidad con Excel en cuanto a las fechas, y su respuesta fue afirmativa, con la excepción de enero y febrero de 1900, el dueño de Microsoft exclamó joder tan solo cuatro veces.

Facebooktwitterlinkedin