Una fórmula más rápida para convertir fechas del calendario gregoriano

Fuentes: Counting the days, revisited

Artículo técnico que revisa y mejora un algoritmo clásico para convertir fechas del calendario gregoriano en números lineales de días (rata die o día juliano), la misma operación que en C realiza mktime(). El autor parte de una publicación suya de 2008 y de las observaciones de Ben Joffe para proponer una versión más eficiente y correcta de la fórmula. La idea central consiste en reajustar el mes y el año de modo que enero y febrero se contabilicen al final del año anterior, lo que alinea el patrón repetitivo de cinco meses largos y cortos con el ciclo de años bisiestos. A partir de ahí, la expresión final suma días por años normales, suma y resta años bisiestos julianos y la corrección gregoriana (divisibilidad por 100 y 400), y añade los días del año en curso mediante una multiplicación con desplazamiento por 32 optimizada para el compilador. El texto también aclara la elección de la época (por ejemplo, r.d. 1 para el 1 de enero del año 1, r.d. 678576 para la época MJD o r.d. 719163 para la época Unix), discute el uso de enteros sin signo de 32 bits para evitar los problemas de la división truncada hacia cero, y propone pruebas de año bisiesto y de longitud de mes más elegantes, incluida la expresión 30 | (m ^ (m >> 3)) atribuida a Matthias Kretz, que en ARM se compila en sólo dos instrucciones.