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

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

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

спасибо! Марк!--3-->

6 ответов


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

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


если мы получим двойной юлианская дата, такие как решения chordiant менеджер

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

следующее работает, но второе не заботится о как я могу конвертировать между датой Java и номером дня Julian?

public static String julianDate (строка 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 упомянул Жана Миуса, и он абсолютно прав

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

Джулиан дата дата, выраженный как обычно, с годом, месяцем и днем.

Джулиан Дэй-это (реальное число), отсчитывается от года -4712 и есть "...непрерывный отсчет дней..."(и часть дня). А полезное шкала времени, используемая для точных астрономических расчетов.

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


tl; dr

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

"Юлианский день" терминология

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

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

java.время

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

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

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 / dayOfYear: 159

часовой пояс имеет решающее значение для определения даты. Для любого данного момента дата варьируется по всему миру по зонам. Например, через несколько минут после полуночи в Париже Франция-это новый день, а еще "вчера" в Монреаль Квебек.

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

идя в другом направлении, от числа до даты.

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

о java.время

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

в Joda Времени, теперь режим обслуживания, советует миграцию в java.время классы.

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

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

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP....

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