Юлианский день года в Java

Я видел «решение» по адресу http://www.rgagnon.com/javadetails/java-0506.html , но он работает неправильно. Например, вчера (8 июня) должно было быть 159, но он сказал, что это 245.

Итак, есть ли у кого-нибудь решение на Java для получения трехзначного юлианского дня текущей даты (а не юлианской даты – мне нужен день в этом году)?

Благодаря! отметка

    Если все, что вам нужно, это день года, почему бы вам не использовать поле 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)); } 

    }

    Кроме того, вы можете рассчитать разницу между сегодняшней юлианской датой и 1 января этого года. Но обязательно добавьте 1 к результату, так как 1 января – это не нулевой день года:

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

    Обратите внимание, что это не учитывает сделку «начинается в полдень», заявленная этим странным сайтом, на который вы ссылались. Это можно было бы исправить, просто проверив время, конечно.

    если мы получим двойную юлианскую дату, такую ​​как хордант-менеджер

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

    Следующее работает, но второе не позаботится о том, как я могу преобразовать число Java Date и Julian day?

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

    Я читал все сообщения, и что-то не очень ясно, я думаю.

    user912567 упоминает Jean Meeus, и он абсолютно прав

    Наиболее точное определение, которое я нашел, дано Жаном Миусом в его книге «Астрономические алгоритмы» (должно быть, действительно …).

    Julian Date – дата , выраженная как обычно, с годом, месяцем и днем.

    Юлианский день – это число (реальное число), отсчитываемое с года -4712 и «… непрерывное количество дней …» (и часть дня). Полезная временная шкала, используемая для точных астрономических расчетов.

    Жан Миус: «Юлианский день не имеет ничего общего с юлианским календарем» («Астрономические алгоритмы», 2-е издание, с.59)

    ТЛ; др

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

    Термин «Юлианский день»

    Термин «юлианский день» иногда используется свободно, чтобы означать порядковый день года, или ординарную дату , то есть число от 1 до 365 или 366 ( високосные годы ). 1 января 1, 2 января – 2 , 31 декабря – 365 (или 366 в високосные годы).

    Это свободное (неправильное) использование Julian вероятно, происходит от использования в астрономии и других областях дат отслеживания как непрерывное количество дней с полудня Universal Time 1 января 4713 года до нашей эры (в юлианском календаре ). В настоящее время 2,457,576 дата приближается к двум с половиной миллионам, 2 2,457,576 сегодня.

    java.time

    Рамка java.time, встроенная в Java 8 и более поздние версии, обеспечивает легкий доступ к дневному году.

    Класс LocalDate представляет значение даты только без времени и без часового пояса. Вы можете допросить в течение дня.

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

    Сбросьте консоль. Результаты показывают, что 8 июня 2010 года действительно день № 159.

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

    localDate: 2010-06-08 | деньОбщий год: 159

    Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париже Франция – новый день, еще «вчера» в Монреале Квебек.

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

    Переход в другое направление – от числа до даты.

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

    О java.time

    Рамка java.time встроена в Java 8 и более поздние версии . Эти classы вытесняют неприятные старые устаревшие classы времени, такие как java.util.Date , Calendar и SimpleDateFormat .

    Проект Joda-Time , теперь в режиме обслуживания , советует перейти на classы java.time .

    Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .

    Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.* .

    Где можно получить classы java.time?

    • Java SE 8 , Java SE 9 , Java SE 10 и более поздние версии
      • Встроенный.
      • Часть стандартного Java API с интегрированной реализацией.
      • Java 9 добавляет некоторые незначительные функции и исправления.
    • Java SE 6 и Java SE 7
      • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport .
    • Android
      • Более поздние версии реализаций пакетов Android classов java.time.
      • Для более ранних Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP ….

    Проект ThreeTen-Extra расширяет java.time с дополнительными classами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные classы, такие как Interval , YearWeek , YearQuarter и другие .

    Давайте будем гением компьютера.