Il giorno giuliano dell’anno in Java

Ho visto la “soluzione” su 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.

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! marchio

Se tutto ciò che vuoi è il giorno dell’anno, perché non usi semplicemente il campo DAY_OF_YEAR GregorianCalendars?

 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)); } 

}

In alternativa, è ansible calcolare la differenza tra la data giuliana odierna e quella del primo gennaio di quest’anno. Ma assicurati di aggiungere 1 al risultato, dal momento che il primo gennaio non è il giorno zeroth 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()); 
 DateFormat d = new SimpleDateFormat("D"); System.out.println(d.format(date)); 
 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.

se otteniamo una doppia data giuliana come un decisore chordiant

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

Quanto segue funziona ma il secondo non viene preso in considerazione Come posso convertire tra un giorno Java e il numero del giorno giuliano?

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; } 

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

user912567 ha menzionato Jean Meeus e ha assolutamente ragione

La definizione più accurata che ho trovato è data da Jean Meeus nel suo libro “Astronomical Algorithms” (un must have, davvero …).

Julian Date è una data , espressa 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). Una scala temporale utile per calcoli astronomici accurati.

Jean Meeus: “Il Julian Day non ha nulla a che fare con il calendario giuliano” (“Astronomical Algorithms”, 2nd Edition, p.59)

tl; dr

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

Terminologia “Julian day”

Il termine “giorno giuliano” è talvolta usato in modo approssimativo per indicare il giorno ordinale dell’anno, o la data ordinale , che indica un numero da 1 a 365 o 366 ( anni bisestili ). 1 gennaio è l’ 1 , 2 gennaio 2, il 31 dicembre è 365 (o 366 negli anni bisestili).

Questo uso scorretto (errato) di Julian deriva probabilmente dall’uso in astronomia e in altri campi delle date di rintracciamento come un conteggio continuo di giorni da mezzogiorno a Universal Time il 1 ° gennaio 4713 aC (sul calendario giuliano ). Oggi la data giuliana si avvicina a due milioni e mezzo, 2,457,576 oggi.

java.time

Il framework java.time integrato in Java 8 e versioni successive fornisce una facilità semplice per ottenere il giorno dell’anno.

La class 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 (); 

Scarica alla console. I risultati mostrano che l’8 giugno 2010 è davvero 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 (); 

Andando nella direzione opposta, da un numero a una data.

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

A proposito di java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date , Calendar e SimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

È ansible scambiare oggetti java.time direttamente con il proprio database. Utilizzare un driver JDBC compatibile con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità per le classi java.sql.* .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 e versioni successive
    • Built-in.
    • Parte dell’API Java standard con un’implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per Android precedente (<26), il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP ….

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval , YearWeek , YearQuarter e altro .