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
Donde dice si M<2 ⇒M=M+12 ; Y=Y-1
Debería decir si M<=2 ⇒M=M+12 ; Y=Y-1
Saludos
Gracias Albert, tienes razón corregido.
Gracias por la formula 🙂
HOLA SALUDOS,
NOSE PROGRAMACIÓN MUCHO DE PROGRAMACIÓN Y SERÍA INCREIBLE QUE LO EXPUESTO LO TRANSFORMARAN EN UNA FUNCION SQL ME AYUDARÍA DE MUCHO…
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.
Me perdir con todo esto.. necesito con urgencia convertir este fomato juliano a gregiriano.. pero no logro que funcione en oracle
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.
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
Hola…..una ayuda por favor…¿como puedo calcular la hora siderea local?…es para hacer un codigo en vb…Gracias
los cálculos están en https://agrupacionastronomicamagallanes.wordpress.com/experimento-de-eratostenes/hora-siderea-y-ascension-recta-local/
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
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.
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
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.
Hola que tal tengo una duda del porque sale esta formula para calcular el día juliano no se si me puedan ayudarme?
No me queda claro los términos 30.6001 ni 1524,5. Podrían desarrollarlos? Gracias
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,
Ok, gracias. Puedes contactar en el habitual contacto@aamagallanes.es
Gracias. Cuando tenga corregidos algunos errores que estoy detectando, les haré llegar el libro de Excel. Saludos
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
Puedes mandarlo a aamagallanesjerez@gmail.com y vemos como incorporarlo nosotros, por supuesto con tu autoría por delante. Muchas Gracias.
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
Gracias por el aporte
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.
Hoola, hay una manera mas fácil de calcular el dia juliano, y que me de como resultado solo tres digitos del dia juliano
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
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
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.
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