2010-06-09 152 views
14

He visto la "solución" en http://www.rgagnon.com/javadetails/java-0506.html, pero no funciona correctamente. P.ej. ayer (8 de junio) debería haber sido 159, pero dijo que era 245.Día juliano del año en Java

Entonces, ¿alguien tiene una solución en Java para obtener el día juliano de tres dígitos de la fecha actual (no la fecha juliana? Necesito el día de este año)?

Gracias! Marcos

+0

Hola Marcos, También me gustaría saber esto, porque quiero usarlo en un programa de Astronomie estoy trabajando en y yo prefiero que ver directamente que en Java y no de codificación yo mismo :) –

+1

Este día del año (1-366) se conoce más correctamente como [* Ordinal Date *] (https://en.wikipedia.org/wiki/Ordinal_date). El uso aquí de "Julian" es común pero, hasta donde yo sé, es incorrecto. Aparentemente una combinación con el [* Julian Day *] (https://en.wikipedia.org/wiki/Julian_day) que es el número entero asignado a un día solar completo en el recuento de días julianos a partir del mediodía. Hora universal, con día juliano. número 0 asignado al día que comienza al mediodía del 1 de enero de 4713 aC, calendario juliano proléptico (24 de noviembre de 4714 aC, en el calendario gregoriano proléptico). Ej: 2000-01-01T12: 00: 00Z = 2,451,545. –

Respuesta

5

Si todo lo que desea es el día del año, ¿por qué no utiliza el campo GregorianCalendars DAY_OF_YEAR?

import java.util.GregorianCalendar; 
public class CalTest { 
    public static void main(String[] argv) { 
     GregorianCalendar gc = new GregorianCalendar(); 
     gc.set(GregorianCalendar.DAY_OF_MONTH, 8); 
     gc.set(GregorianCalendar.MONTH, GregorianCalendar.JUNE); 
     gc.set(GregorianCalendar.YEAR, 2010); 
     System.out.println(gc.get(GregorianCalendar.DAY_OF_YEAR)); 
} 

}

Como alternativa, puede calcular la diferencia entre la fecha juliana de hoy y la del 1 Ene de este año. Pero asegúrese de añadir 1 al resultado, desde ene 1 ª no es el día cero del año:

int[] now = {2010, 6, 8}; 
int[] janFirst = {2010, 1, 1}; 
double dayOfYear = toJulian(now) - toJulian(janFirst) + 1 
System.out.println(Double.valueOf(dayOfYear).intValue()); 
+0

¡Muchas gracias! Eso funcionó perfectamente, sabía que tenía que haber una respuesta simple. – Mark

5
import java.util.Calendar; 
// ... 
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR); 

Tenga en cuenta que esto no toma en cuenta el "comienza al mediodía" acuerdo reclamado por ese sitio extraño al que hizo referencia. Eso podría solucionarse simplemente verificando el tiempo, por supuesto.

+0

En mi sistema 'System.out.println (Calendar.getInstance(). GetClass());' imprime 'clase java.util.GregorianCalendar' pero tal vez sea lo mismo que julian. – aioobe

+2

La "Fecha Juliana" o "Día Juliano" siempre me ha significado el día del año. Creo que eso es cierto para todo el mundo, excepto quizás para los estudiosos clásicos serios. Si alguien está buscando la fecha según un calendario pre-gregoriano, mi solución no funcionará. Tenga en cuenta que la pregunta incluye la oración: "Necesito el día de este año". – Pointy

+0

Antes de hacer el cálculo, haga 'setGregorianChange (new Date (Long.MAX_VALUE))'. Entonces será un día 'Juliano'. –

2

si tenemos una cita doble Julian como gestor de decisión Chordiant

http://java.ittoolbox.com/groups/technical-functional/java-l/java-function-to-convert-julian-date-to-calendar-date-1947446

la siguiente está trabajando, pero el segundo no se tiene cuidado de How can I convert between a Java Date and Julian day number?

public static String JulianDate (String julianDateStr) {

try{ 
     // Calcul date calendrier Gr?gorien ? partir du jour Julien ?ph?m?ride 
     // Tous les calculs sont issus du livre de Jean MEEUS "Calcul astronomique" 
     // Chapitre 3 de la soci?t? astronomique de France 3 rue Beethoven 75016 Paris 
     // Tel 01 42 24 13 74 
     // Valable pour les ann?es n?gatives et positives mais pas pour les jours Juliens n?gatifs 
     double jd=Double.parseDouble(julianDateStr); 
      double z, f, a, b, c, d, e, m, aux; 
      Date date = new Date(); 
      jd += 0.5; 
      z = Math.floor(jd); 
      f = jd - z; 

      if (z >= 2299161.0) { 
       a = Math.floor((z - 1867216.25)/36524.25); 
       a = z + 1 + a - Math.floor(a/4); 
      } else { 
       a = z; 
      } 

      b = a + 1524; 
      c = Math.floor((b - 122.1)/365.25); 
      d = Math.floor(365.25 * c); 
      e = Math.floor((b - d)/30.6001); 
      aux = b - d - Math.floor(30.6001 * e) + f; 
      Calendar calendar = new GregorianCalendar(); 
      calendar.setTime(date); 
      calendar.set(Calendar.DAY_OF_MONTH, (int) aux); 

      double hhd= aux-calendar.get(Calendar.DAY_OF_MONTH);     
      aux = ((aux - calendar.get(Calendar.DAY_OF_MONTH)) * 24); 




      calendar.set(Calendar.HOUR_OF_DAY, (int) aux); 

      calendar.set(Calendar.MINUTE, (int) ((aux - calendar.get(Calendar.HOUR_OF_DAY)) * 60)); 



     // Calcul secondes 
      double mnd = (24 * hhd) - calendar.get(Calendar.HOUR_OF_DAY); 
      double ssd = (60 * mnd) - calendar.get(Calendar.MINUTE); 
      int ss = (int)(60 * ssd); 
      calendar.set(Calendar.SECOND,ss); 



      if (e < 13.5) { 
       m = e - 1; 
      } else { 
       m = e - 13; 
      } 
      // Se le resta uno al mes por el manejo de JAVA, donde los meses empiezan en 0. 
      calendar.set(Calendar.MONTH, (int) m - 1); 
      if (m > 2.5) { 
       calendar.set(Calendar.YEAR, (int) (c - 4716)); 
      } else { 
       calendar.set(Calendar.YEAR, (int) (c - 4715)); 
      } 


     SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
     //System.out.println("Appnumber= "+appNumber+" TimeStamp="+timeStamp+" Julian Date="+julianDateStr+" Converted Date="+sdf.format(calendar.getTime())); 
     return sdf.format(calendar.getTime()); 

}catch(Exception e){ 
    e.printStackTrace(); 
} 
return null; 

} 
8
DateFormat d = new SimpleDateFormat("D"); 
System.out.println(d.format(date)); 
2

He leído todas las publicaciones y algo no está muy claro, creo.

user912567 mencionado Jean Meeus, y tiene toda la razón

La definición más precisa que he encontrado está dada por Jean Meeus en su libro "Los algoritmos astronómicos" (a debe tener, de verdad ...).

Julian Date es un fecha, expresada como de costumbre, con un año, un mes y un día.

Julian Day es un número (un número real), contado a partir del año -4712 y es "... un conteo continuo de días ..." (y fracción de día). A útil escala de tiempo utilizada para cálculos astronómicos precisos.

Jean Meeus: "The Julian Day no tiene nada que ver con el calendario juliano" ("Astronomical Algorithms", 2nd Edition, p.59)

+0

Exactamente. Vale la pena señalar que, contrariamente a muchas respuestas y comentarios aquí, el día juliano sigue siendo útil en la informática moderna, ya que puede calcular las diferencias de fecha * con él en días con muy poco esfuerzo. – EJP

1

tl; dr

LocalDate.now(ZoneId.of(“America/Montreal”)).getDayOfYear() 

terminología “días Julian”

El término “días Julian” a veces se utiliza libremente para significar la ordinal días del año, o Ordinal date, lo que significa un número de 1 a 365 o 366 (leap years). El 1 de enero es 1, el 2 de enero es 2, el 31 de diciembre es 365 (o 366 en años bisiestos).

Este uso sueltos (indebido) de Julian probablemente proviene de los otros campos de la use in astronomy y seguimiento de fechas como un recuento continuo de días desde el mediodía GMT del 1 de enero de 4713 aC (en la Julian calendar). Hoy en día, la fecha juliana se acerca a los dos millones y medio, 2,457,576 en la actualidad.

java.time

El marco java.time incorporado en Java 8 y posterior proporciona una instalación fácil de obtener el día de año.

La clase LocalDate representa un valor de fecha solamente sin hora del día y sin zona horaria. Puede interrogar para el día del año.

LocalDate localDate = LocalDate.of (2010 , Month.JUNE , 8); 
int dayOfYear = localDate.getDayOfYear(); 

Volcar a la consola. Los resultados muestran que el 8 de junio de 2010 es de hecho el día # 159.

System.out.println ("localDate: " + localDate + " | dayOfYear: " + dayOfYear); 

LocalDate: 2010-06-08 | dayOfYear: 159

Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día cuando todavía está "ayer" en Montreal Québec.

ZoneId z = ZoneId.of(“America/Montreal”); 
LocalDate today = LocalDate.now(z); 
int dayOfYear = today.getDayOfYear(); 

Yendo en la otra dirección, de un número a una fecha.

LocalDate ld = Year.of(2017).atDay(159) ; 
Cuestiones relacionadas