2010-06-09 38 views
14

Ho visto la "soluzione" a http://www.rgagnon.com/javadetails/java-0506.html, ma non funziona correttamente. Per esempio. ieri (8 giugno) avrebbe dovuto essere 159, ma ha detto che era 245.Giorno giuliano dell'anno in Java

Quindi, qualcuno ha una soluzione in Java per ottenere il giorno giuliano a tre cifre della data corrente (non la data giuliana - ho bisogno del giorno di quest'anno)?

Grazie! Mark

+0

Ehi Mark, mi piacerebbe anche sapere questo, perché voglio usarlo in un programma di astronomia su cui sto lavorando e io preferisco fare direttamente che in java e non codifica io stesso :) –

+1

Questo giorno dell'anno (1-366) più correttamente noto come [* Data ordinale *] (https://en.wikipedia.org/wiki/Ordinal_date). L'uso qui di "Julian" è comune ma, per quanto ne so, non è corretto. Apparentemente una fusione con il [* Julian Day *] (https://en.wikipedia.org/wiki/Julian_day) che è il numero intero assegnato a un intero giorno solare nel conteggio del giorno giuliano a partire da mezzogiorno all'ora universale, con il giorno di Julian numero 0 assegnato al giorno a partire da mezzogiorno del 1 gennaio, 4713 aC, calendario prolittico giuliano (24 novembre 4714 aC, nel calendario gregoriano prolettico). Es: 2000-01-01T12: 00: 00Z = 2.451.545. –

risposta

5

Se tutto ciò che vuoi è il giorno dell'anno, perché non usi semplicemente il 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)); 
} 

}

alternativa, è possibile calcolare la differenza tra la data odierna Giuliano e quella del 1 gennaio di quest'anno. Ma essere sicuri di aggiungere 1 al risultato, dal momento che 1 gennaio non è il giorno zero della dell'anno:

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

Grazie mille! Ha funzionato perfettamente - sapevo che doveva esserci una risposta semplice. – Mark

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

Si noti che questo non tiene conto dell'accordo "inizia a mezzogiorno" rivendicato da quel sito strano a cui si fa riferimento. Questo potrebbe essere risolto semplicemente controllando l'ora, naturalmente.

+0

Sul mio sistema 'System.out.println (Calendar.getInstance(). GetClass());' stampa 'classe java.util.GregorianCalendar' ma forse è la stessa di Julian. – aioobe

+2

Il "Julian Date" o "Julian Day" ha sempre significato per me il giorno dell'anno. Penso che sia vero per tutti tranne forse studiosi classici seri. Se qualcuno sta cercando la data in base a un calendario pre-gregoriano, la mia soluzione non funzionerà. Si noti che la domanda include la frase: "Ho bisogno del giorno di quest'anno". – Pointy

+0

Prima di eseguire il calcolo, fare 'setGregorianChange (new Date (Long.MAX_VALUE))'. Quindi sarà un giorno 'Julian'. –

2

se otteniamo un doppio appuntamento julian come direttore decisione Chordiant

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

di seguito è riportato di lavoro ma il secondo non è preso cura di How can I convert between a Java Date and Julian day number?

String public static 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

Ho letto tutti i post e qualcosa non è molto chiaro, penso.

user912567 menzionate Jean Meeus, e lui è assolutamente ragione

La definizione più accurata che ho trovato è data da Jean Meeus nel suo libro "Astronomical Algorithms" (un must, in realtà ...).

Julian Date è un data, espresso come al solito, con un anno, un mese e un giorno.

Julian Day è un numero (un numero reale), contato dall'anno -4712 ed è "... un conteggio continuo di giorni ..." (e frazione del giorno). A scala di tempo utile utilizzata per calcoli astronomici accurati.

Jean Meeus: "Il giorno giuliano non ha nulla a che fare con il calendario giuliano" ("Algoritmi astronomici", 2a edizione, p.59)

+0

Esattamente così. Vale la pena notare che, contrariamente a molte risposte e commenti, il giorno giuliano rimane utile nel calcolo moderno, in quanto è possibile calcolare date * differenze * con esso in giorni con pochissimo sforzo. – EJP

1

tl; dr

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

terminologia “giorno Giuliano”

Il termine “giorno giuliano” è talvolta usato impropriamente per indicare il ordinal giorno dell'anno, o Ordinal date, il che significa un numero da 1 a 365 o 366 (leap years). 1 gennaio è 1, 2 gennaio è 2, il 31 dicembre è 365 (o 366 negli anni bisestili).

Questo sciolti (corretto) utilizzo di Julian deriva probabilmente dalle altre use in astronomy e campi di monitoraggio di date come un conteggio continuo di giorni da mezzogiorno Universal Time il 1 ° gennaio, 4713 aC (sul Julian calendar). Al giorno d'oggi la data giuliana si avvicina a due milioni e mezzo, 2,457,576 oggi.

java.time

Il quadro java.time integrato in Java 8 e versioni successive fornisce una struttura facile da ottenere il giorno d'anno.

La classe LocalDate rappresenta un valore di sola data senza ora del giorno e senza fuso orario. Puoi interrogare per il giorno dell'anno.

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

Discarica per consolle. I risultati mostrano che 8 giugno 2010 è infatti il ​​giorno # 159.

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

localDate: 2010-06-08 | dayOfYear: 159

Un fuso orario è fondamentale per determinare una data. Per un dato momento, la data varia in tutto il mondo per zona. Ad esempio, pochi minuti dopo la mezzanotte a Parigi, la Francia è un nuovo giorno mentre è ancora "ieri" a Montréal Québec.

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

In direzione opposta, da un numero a una data.

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