VARIANTE DATE a cadena datetime
Esta calculadora en línea convierte el valor de la VARIANTE DATE (double) en una cadena datetime.
![Creative Commons Attribution/Share-Alike License 3.0 (Unported)](/img/lic/by-sa.png)
Este contenido está bajo licencia de Creative Commons Attribution/Share-Alike License 3.0 (Unported). Esto significa que puedes redistribuirlo o modificar su contenido en forma libre bajo las mismas condiciones de licencia y debes mantener la atribución del mismo al autor original de este trabajo colocando un hipervínculo en tu sitio web a este trabajo https://es.planetcalc.com/7027/. Así mismo, por favor no modifiques o alteres ninguna de las referencias al trabajo original (si hubiera alguna) que se encuentre en este contenido.
Hace mucho, mucho tiempo, en el desarrollo de software...
Había un tipo VARIANTE, que podía contener cualquiera de muchos otros valores de tipo de datos (vartypes), ver Wikipedia. Y uno de los vartypes era VT_DATE, también conocido como Variant date, DATE (double), o también OLE variant date. Era un valor DateTime representado como un doble - número de punto flotante de 8 bytes. Por cierto, todo lo relacionado con el tipo de dato variante sigue siendo relevante hoy en día, excepto que la programación hardcore de Windows o COM/ActiveX/OLE no parece la corriente principal hoy en día.
A veces, cuando usted ve algo como 42842.370277778, lo más probable es que sea una variante date. Y aquí hay una sencilla calculadora que toma un valor doble, lo interpreta como la variante date, y emite la fecha y la hora codificadas en este valor doble. Quienes sientan curiosidad por el formato de las variantes date y la historia que hay detrás de ellas pueden seguir leyendo después de la calculadora.
Sobre el formato de la variante date.
Según la documentación, los días se representan por incrementos de números enteros a partir del 30 de diciembre de 1899, la medianoche como hora cero. Los valores de las horas se expresan como el valor absoluto de la parte fraccionaria del número.
Sin embargo, hay una trampa. Aunque los valores del día se vuelven negativos antes de la medianoche del 30 de diciembre de 1899, los valores de la hora del día no lo hacen. Por ejemplo, las 6:00 AM siempre se representan con un valor fraccionario de 0,25, independientemente de que el número entero que representa el día sea positivo (después del 30 de diciembre de 1899) o negativo (antes del 30 de diciembre de 1899).
Debido a esto, el valor de -1,25 representa 29/12/1899 06:00 AM, y el valor de -1,30 representa 29/12/1899 07:12 AM. Es decir, mientras el segundo valor doble es menor que el primer valor doble, como la fecha, es mayor que la primera fecha.
Además, los valores de fecha entre -1,0 y 0,0 representan las mismas fechas lógicas que sus homólogos positivos. Es decir, -0,5 y 0,5 son el mismo 30/12/1899 12:00.
También se preguntará por qué la variante date tiene un punto cero tan extraño: el 30 de diciembre de 1899, en lugar del 1 de enero de 1900 (punto cero de SQL Server) o el 1 de enero de 1970 (punto cero de Unix/Javascript). Como escribió Eric Lippert, "En realidad, resulta que esto es para solucionar un error en Lotus 1-2-3". Los detalles se pierden en la neblina de los tiempos, pero al parecer, Lotus 1-2-3 utilizaba este formato de fecha, pero sus desarrolladores olvidaron que 1900 no era un año bisiesto. Microsoft corrigió este error retrasando el primer día un día". Esta y otras rarezas de VT_DATE se explican en su artículo, y es una lectura fascinante para un viejo desarrollador como yo. Que lo disfrute.
Comentarios