2010-06-09 14 views
14

Widziałem "rozwiązanie" na http://www.rgagnon.com/javadetails/java-0506.html, ale nie działa poprawnie. Na przykład. wczoraj (8 czerwca) powinno być 159, ale było napisane, że to 245.Dzień juliański roku w Javie

Czy ktoś ma rozwiązanie w języku Java, aby uzyskać trzy cyfrowy datownik dnia Juliana (a nie datę juliańską - potrzebuję dnia w tym roku)?

Dzięki! Oznaczenie:

+0

Hej Mark, Ja również chciałabym to wiedzieć, ponieważ chcę, aby użyć go w programie astronomie pracuję nad i wolę to zrobić bezpośrednio w java i nie kodowanie to sam :) –

+1

Ten dzień w roku (1-366) bardziej znany jako [* Data porządkowa *] (https://en.wikipedia.org/wiki/Ordinal_date). Użycie tutaj słowa "Julian" jest powszechne, ale jest, o ile wiem, nieprawidłowe. Najwyraźniej połączenie z [* Dniem Juliana *] (https://en.wikipedia.org/wiki/Julian_day), które jest liczbą całkowitą przypisaną całemu słonecznemu dniu w dniu juliańskim, liczy się od południa Czas uniwersalny, z dniem juliańskim numer 0 przypisany do dnia rozpoczynającego się w południe w dniu 1 stycznia 4713 rpne, kalendarz józefeptyczno-juliański (24 listopada 4714 r. p.n.e., w kalendarzu gremeńskim). Np .: 2000-01-01T12: 00: 00Z = 2,451,545. –

Odpowiedz

5

Jeśli chcesz tylko w dzień w roku, dlaczego nie używasz tylko pola Gregorian Kalendarze 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)); 
} 

}

Alternatywnie, można obliczyć różnicę między dzisiejszą datą Juliana i że Jan 1 tego roku. Ale należy dodać 1 do wyniku, od 01 stycznia nie jest zerowe dzień roku:

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

Dziękuję bardzo! To działało doskonale - wiedziałem, że musi być prosta odpowiedź. – Mark

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

Pamiętaj, że nie uwzględnia to transakcji "zaczyna się w południe", o której mowa w tej dziwnej witrynie, do której się odwołałeś. Można to naprawić, sprawdzając czas.

+0

Na moim systemie 'System.out.println (Calendar.getInstance(). GetClass());' wypisuje 'class java.util.GregorianCalendar', ale być może to samo co julian. – aioobe

+2

"Data Juliańska" lub "Dzień Juliana" zawsze znaczyły dla mnie dzień w roku. Myślę, że to prawda dla wszystkich, z wyjątkiem być może poważnych uczonych klasycznych. Jeśli ktoś szuka daty według kalendarza sprzed Gregoriańskiego, moje rozwiązanie nie zadziała. Pamiętaj, że pytanie zawiera zdanie "Potrzebuję dnia w tym roku". – Pointy

+0

Przed wykonaniem obliczeń należy "setGregorianChange (new Date (Long.MAX_VALUE))". Potem będzie dzień "juliański". –

2

jeśli mamy podwójną randkę Julian, takich jak menedżer decyzji Chordiant

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

Poniższy działa, ale drugi nie jest załatwione 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

Przeczytałem wszystkie posty i wydaje mi się, że nie jest to zbyt jasne.

user912567 mentionned Jean Meeus, a on całkowitą rację

Najbardziej dokładna definicja Znalazłem jest przez Jean Meeus w „Algorytmy astronomiczne” książki (musi mieć, naprawdę ...).

Data juliańska to data, wyrażona jak zwykle, z rokiem, miesiącem i dniem.

Julian Day to numer (liczba rzeczywista), liczony od roku -4712 i "... ciągła liczba dni ..." (i część dnia). A użyteczny Skala czasowa używana do dokładnych obliczeń astronomicznych.

Jean Meeus: "Dzień juliański nie ma nic wspólnego z kalendarzem juliańskim" ("Algorytmy astronomiczne", wydanie 2, s.59)

+0

Dokładnie tak. Warto zauważyć, że w przeciwieństwie do wielu odpowiedzi i komentarzy tutaj dzień juliański jest nadal przydatny we współczesnej informatyce, ponieważ można obliczyć datę * różnic * w ciągu kilku dni przy niewielkim wysiłku. – EJP

1

tl; dr

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

„juliańska” terminologii

Określenie „juliańska” są czasami używane luźno oznacza ordinal dni w roku, lub Ordinal date, co oznacza liczbę od 1 do 365 lub 366 (leap years). 1 stycznia to 1, 2 stycznia to 2, 31 grudnia to 365 (lub 366 w latach przestępnych).

Ten luźny (nieprawidłowe) stosowanie Julian prawdopodobnie pochodzi od use in astronomy i innych dziedzin śledzenie daty jako ciągłego liczenia dni od południa czasu uniwersalnego z dniem 1 stycznia 4713 roku pne (na Julian calendar). W dzisiejszych czasach data juliańska zbliża się do dwóch i pół miliona, 2,457,576.

java.time

Ramy java.time wbudowane w Java 8 i później zapewnia łatwy obiekt, aby dostać się z dnia na dzień w roku.

Klasa LocalDate reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej. Możesz przesłuchiwać w dzień w roku.

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

Zrzut na konsolę. Wyniki pokazują, że 08 czerwca 2010 to rzeczywiście dzień # 159.

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

LOCALDATE: 2010-06-08 | dayOfYear: 159

Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W danym momencie data zmienia się na całym świecie według strefy. Na przykład, kilka minut po północy w Paryżu Francja jest nowym dniem, a jednocześnie "wczoraj" w Montrealu Québec.

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

Przejście w innym kierunku, od liczby do daty.

LocalDate ld = Year.of(2017).atDay(159) ; 
Powiązane problemy