Sea D el día del mes, M el número de mes, e Y la cifra del año.

Aclaración

Si la fecha de la que partimos es anterior a Cristo, para pasarla a cifra numérica hemos de sumarle un año, es decir, si queremos por ejemplo, pasar a cifra numérica el 125 a. C., no se corresponde con el -125, sino con el -124. Esto es debido al salto que hubo en el contar de los años cuando se pasó de antes a despúes de Cristo. No hubo año 0, se pasó  de 1 a. C. al 1 d. C., para adaptarlo a números enteros continuos, debemos pues sumar un año a todos los años anteriores a Cristo.

Continuemos:

  • si M<=2 ⇒M=M+12 ; Y=Y-1
  • si M>2   M e Y no varían

Calculamos las siguientes magnitudes auxiliares

A=INT(Y/100)

B=2-A+INT(A/4)

Donde la función “INT” es la parte entera por defecto de la operación indicada.

Antes de seguir, tenemos otra cuestión. En el 4 de octubre de 1582 se produjo una reforma del calendario. se pasó de la fecha juliana (anterior al 4 de ocubre de 1582) a la fecha gregoriana (porterior al 15 de ocubre de 1582). Este paso fue consecutivo, sin los días intermedios. Del jueves 4 de octubre de 1582 siguió el viernes 15 de ocubre de 1582.

Si estamos convirtiendo una fecha anterior a la reforma gregoriana del calendario, o sea, fecha anterior al 15 de octubre de 1582, tenemos que hacer B=0.

El cálculo final para el día juliano, DJ, es:

DJ=INT(365,25(Y+4716) )+INT(30,6001(M+1) )+D+B-1524,5

El día juliano representa una cuenta continua de días desde el 1 de Enero del año 4713 a. C. a las 12 horas Tiempo Universal (TU). La parte decimal de nuestro día Juliano indica que para nuestros propósitos estamos calculando el día juliano de nuestra fecha de observación a las 0 h. TU.

Ejemplo

Calculemos el día juliano correspondiente al 2 de Octubre de 2013 a las 0h TU. Las variables iniciales son las siguientes

D=2

M=10

Y=2013

Las cantidades auxiliares A y B serán

A=INT(2013/100)=INT(20,13)=20

B=2-20+INT(20/4)=-18+5=-13

Y el día juliano correspondiente al 2 de Octubre de 2013 es el

DJ=INT(365,25∙(2013+4716) )+INT(30,6001∙(10+1) )+2-13-1524,5

DJ=INT(365,25∙6729)+INT(30,6001∙11)+2-13-1524,5

DJ=INT(2457767,25)+INT(336,6011)+2-13-1524,5

DJ=2457767+336+2-13-1524,5=2456567,5

Con permiso del autor del articulo, Lito, y ante las dudas para poder implementar la formula en programación, voy a dar una solución para excel que puede ser traspasada a cualquier otro lenguaje.

En ella sólo hay que introducir la fecha, tal cual exacta, ya la hoja se preocupa de tenerlo en cuenta tanto para años a.c., como para el cambio gregoriano, y da error los días fantasma que son del 5 al 14 de octubre de 1582 (ambos incluidos).

Para el 4/10/1582 da 2299160 y para el 15/10/1582 da 2299161, para el 1 de enero de 4.713 da 0 (año -4.713)

Para 15/10/1582

Para 1 de enero de -4.713


Y el día de hoy el artículo actualizado para programadores es



29 thoughts on “Conversión de fecha a día juliano”

    1. Perdona Diego, este mensaje se ha quedado pendiente no visible. Si te sirve de ayuda te paso un enlace con un conversor web http://www.ugr.es/~eaznar/conversorFecha.htm. SI lo que quieres es código, en astronomía se usa actualmente el Phyton puedes ver una rutina en http://es.scribd.com/doc/170407577/Dia-Juliano-Python#scribd. Si la quieres en Sql, directamente tienes una función TO_CHAR («AAAA-MM-DD», j) con el parametro j te da la fecha en juliana, si quieres al reves existe TO_DATE con el mismo parámetro te pasa día juliano a fecha.

  1. Tengo entendido que la fecha inicial es el 1 de enero de 4713 y no el 4716 A.C. podrían confirmarme ese dato. Y si 4713 fuese lo correcto cuales serían los cambios en las fórmulas.

    1. Efectivamente, el día julino empieza su cuenta el 1 de Enero del 4713 a. C., en el texto del artículo aparece el año 4716 a. C., una errata que se ha colado. Procedo a corregirla. Sin embargo las fórmulas para obtenerlas están bien escritas, lo he vuelto a repasar y no hay que corregirlas.
      Carlos, muchas gracias por detectar esta errata.

      Saludos

  2. Hay algo que no entiendo de la fórmula…¿Si introduzco la fecha 1,5 de Enero de -4713 (1,5 porque es a las 12 horas) no debería dar cero? Me da -326

    1. Efectivamente tus cálculos son correctos.
      Gracias Francisco por tu aportación. Gracias a ella he detectado que me faltaba aclarar en el artículo dos sucesos importantes que sucedieron en la antiguedad para la correcta aplicación de la conversión de fecha de calendario a día juliano.
      La primera es cómo expresar correctamente numericamente hablando los años anteriores a cristo y la segunda, el impacto en la fórmula del día juliano de la reforma gregoriana del calendario.
      Ya he comentado dichos hechos en el artículo, así los cálculos para la fecha que indicas, dan lo correcto, es decir 0.

  3. Hola a todos:
    Este es un tema que me interesa y estoy tratando de solucionar que calcule cualquier fecha y no solo de unos siglos y entre otras barreras con la que me encuentro es como calcular antes del 4 y 15 de octubre de 1582, lo he hecho en programación pero solo coge los siglos en que por ejemplo coge el XX y XXI, pero no se como poner antes de la fecha del cambio, ya que la variable B cambia completamente, ¿podéis ayudarme?

    Gracias por todo.
    Saludos

    1. Claro, para explicarlo es complicado sin hacerlo en algún formato de programación, todo está dicho ya en el articulo pero implementarlo es otra cosa. Aquí no tengo espacio suficiente, voy a programarlo para excel por ejemplo y solo tienes que pasarlo a otro lenguaje. Si no entiendes las instrucciones en excel me preguntas. Lo mejor, con permiso de Lito, lo voy a publicar en la página, ya algún otro amigo lo había pedido pero hay que buscar tiempo.

  4. Buenos días desde Canarias.
    Al tener algunas incidencias en los cálculos, hice un nuevo libro Excel, consultando los resultados con el conversor «https://www.ugr.es/~eaznar/conversorFecha.htm». Además incluí el cálculo de nueva fecha añadiendo una diferencia en días y la diferencia en días entre dos fechas a partir del año 4713 a.C. (Sabes que Excel no admite fechas anteriores a 1900 d.C.). Por cierto, alguien tendrá que decir a Microsoft que a partir de la entrada en vigor del año gregoriano, los múltiplos de 100 no divisibles por 400 no son bisiestos; sin ir más allá, 1900 no es bisiesto.
    Si me das un correo, te puedo mandar la tabla de Excel.
    Un saludo afectuoso,

  5. Hola a todos, por si a alguien le interesa. Son las funciones que se pueden ingresar en una macro en Excel, estan realizadas en VB6 para utilizarse en Excel, no vi como ingresar el archivo Excel para compartirlo.

    Private Function NDiasMES(ByVal Mes As Integer) As Integer
    Dim NDMx
    NDMx = Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    NDiasMES = IIf((Mes >= 1) And (Mes = 1) And (Dia = 1) And (Mes 2), (DJAx(Mes – 1) + Bisiesto(Año) + Dia), (DJAx(Mes – 1) + Dia)), (-1)), (-1))
    End Function

    ‘ Día Juliano Astronómico de la FECHA INGRESADA . . .
    Public Function DJAs(ByVal Año As Integer, ByVal Mes As Integer, ByVal Dia As Integer) As Long
    Dim y2 As Double, m2 As Double, d2 As Double, A As Double, B As Double, DJ As Integer
    y2 = IIf(Mes <= 2, IIf(Año < 0, Año, Año – 1), IIf(Año < 0, Año + 1, Año)): m2 = IIf(Mes <= 2, Mes + 12, Mes): d2 = Dia + 0.5
    A = Int(y2 / 100)
    B = IIf(y2 1582, 2 – A + Int(A / 4), IIf(m2 10, 2 – A + Int(A / 4), IIf(d2 = 15, 2 – A + Int(A / 4), 0))))))

    DJ = DJA(Año, Mes, Dia)
    ‘ Verificamos que (05-Octubre-1582 al 15
    If ((Año = 1582) And ((DJ >= 278) And (DJ <= 287))) Then
    DJAs = 0
    Else
    DJAs = Int(365.25 * (y2 + 4716)) + Int(30.6001 * (m2 + 1)) + d2 + B – 1524.5
    End If
    End Function

  6. Os acabo de enviar, una vez revisado, dos nuevos Excel para calcular el día juliano de una fecha, el resultante de añadir o restar un número de días a la fecha inicial y la diferencia entre dos fechas. Espero sus comentarios o problemas que se les puedan presentar. Se han realizado en Office 365.
    Atentamente

  7. Siento disentir de todo el cálculo, pero en la Edad Media, y por ejemplo en Cataluña se usaron hasta 5 fomas de datar «subespecies» del calendario juliano ( año reinado rey franco, era cristiana, era hispánica, indicción y Encarnación ). Se han demostrado documentos no coincidentes en fecha y los especialistas no han logrado dar con el dia que se escribieron. Así que ninguna fórmula matemática es infalible a tantas variables. Existe un conversor de fechas medievales hecho por un Profesor de Matemáticas de la Univ. Autónoma de Bellaterra ( http://mat.uab.cat/~xmora/historia/convertidor.html?fbclid=IwAR3LvaYsnweTE5vMySywHIphW0z5EAUocW38XvAMsSeJhlt0l6gbrAlYLLw ) que cubre un 80% de dataciones correctas, pero él mismo indica que hay excepciones. Yo mismo estoy tratando de averiguar la fecha de un Testamento y me está siendo muy difícil de averiguar el año ( el dia y el mes sí son claros ); simplemente a partir de la datación del mismo, «v Kalendas Augusti anno .xii. regnante Rotbeito rege» se necesitan saber ademas datos históricos en donde se firmó, ya que está demostrado que en según qué Condados de la llamada «Marca hispánica» no seguían el mismo calendarip. En resumen, el cáculo puede ser válido para muchos de los «países» de entonces en la Edad Media, pero en cataluña y Francia ( reino franco mejor dicho ), quedan muchas lagunas que hacen que la traslación de aquellas fechas al calendario gregoriano actual sea difícil. Las Matemáticas no cubren todo ..incluso dicho profesor de las mismas, gran aficionado a la Historia se dio cuenta del problema.

    1. Más fácil no la conozco, pero para quedarte con tres decimales redondea el resultado, el Excel te permite redondear fácilmente . Es =REDONDEAR( A1; 3) te redondea la casilla A1 o la expresión que pongas a 3 decimales, o puedes hacerlo a mano

  8. Aunque esta página ya tiene cierto tiempo, les informo que quien use el programa de hoja de cálculo Calc de la suite libre y gratuita LibreOffice (mi versión a la fecha es la 7.0.5.2) tiene a su disposición una función que permite el cálculo de los días entre dos fechas según este algoritmo. En español, esta función es DIAS(Fecha Final; Fecha Inicio). Si la fecha de inicio es «01/01/-4713» y la fecha final es otra (digamos la fecha actual) se obtendrá la cantidad real de días julianos transcurridos. Vean la página de la ayuda en https://help.libreoffice.org/latest/es/text/scalc/01/func_days.html?DbPAR=CALC#bm_id3151328

  9. Para quien no desee usar las funciones de fecha incorporadas a Calc LibreOffice, le propongo esta macro (macroinstrucción) de VBA (Visual Basic for Applications) Calc y que se puede adaptar a otros lenguajes de programación:

    Function DiaJuliano (Fecha As Date) As Double
    Dim Día%, Mes%, Año% Rem Variables declaradas como enteras
    Dim YY%, MM%, K1#, K2%, K3%, JD#
    Rem En el diseño de esta macro, se asume que la fecha se escribe en una celda como una cadena de caracteres de la cual son extraídos el día, el mes y el año.
    Día = CInt(Mid(Fecha, 1, 2))
    Mes = CInt(Mid(Fecha, 4, 2))
    Año = CInt(Mid(Fecha, 7, 5))
    YY = Iif (Año = 3, Mes-3, Mes+9)
    K1 = Int (365.25*(YY + 4712))
    K2 = Int (30.6*MM + 0.5)
    K3 = Int (Int (0.01*YY+49)*0.75) – 38
    JD = Día + K1 + K2 + 59
    JD = Iif (JD>2299160, JD – K3, JD)
    DiaJuliano = JD Rem El resultado de la variable JD se asigna a DiaJuliano.
    End Function

    Aclaro que las variables las puedo escribir con «ñ»s gracias a la instrucción «Option Compatible». Esta macro funciona a satisfacción y carece de diferencias en su resultado con la función incorporada DIAS(Fecha final; Fecha inicial). Además se confía en los algoritmos internos para determinar que la fecha introducida es «legal» y teniendo en cuenta años bisiestos y otras peculiaridades.

    Otra variante, sin hacer el algoritmo es esta:

    Function Diferencia_fechas (Date1 As Date) As Double
    Dim Df As Double
    Df = DateDiff(«d», «01/01/-4713», Date1)
    Diferencia_fechas = Df
    End Function

    Ignoro si las actuales versiones de Apache OpenOffice y MS Office pueden funcionar así. Sería cosa de probar. Por eso y otras razones, recomiendo el uso de LibreOffice.

  10. Corrijo la macro que quedó mal copiada:

    Function DiaJuliano (Fecha As Date) As Double
    Dim Día%, Mes%, Año% Rem Variables declaradas como enteras
    Dim YY%, MM%, K1#, K2%, K3%, JD#
    Día = CInt(Mid(Fecha, 1, 2))
    Mes = CInt(Mid(Fecha, 4, 2))
    Año = CInt(Mid(Fecha, 7, 5))
    YY = Iif (Año = 3, Mes-3, Mes+9)
    K1 = Int (365.25*(YY + 4712))
    K2 = Int (30.6*MM + 0.5)
    K3 = Int (Int (0.01*YY+49)*0.75) – 38
    JD = Día + K1 + K2 + 59
    JD = Iif (JD>2299160, JD – K3, JD)
    DiaJuliano = JD
    End Function

Deja una respuesta

Tu dirección de correo electrónico no será publicada.