Юлианский день года на Яве - PullRequest
15 голосов
/ 09 июня 2010

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

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

Спасибо!Mark

Ответы [ 6 ]

10 голосов
/ 26 июня 2013
DateFormat d = new SimpleDateFormat("D");
System.out.println(d.format(date));
6 голосов
/ 09 июня 2010

Если вам нужен только день года, почему бы вам просто не использовать поле 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());
6 голосов
/ 09 июня 2010
import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);

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

2 голосов
/ 27 февраля 2016

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

user912567 упомянул Джина Миуса, и он абсолютно прав

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

Юлианская дата - это дата , выраженная как обычно, с годом, месяцем идень.

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

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

2 голосов
/ 25 августа 2011

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

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

Следующее работает, но секунда не учтена Как я могу конвертировать междуДата Java и номер юлианского дня?

открытая статическая строка 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;

}  
1 голос
/ 08 июля 2016

ТЛ; др

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

Терминология «юлианский день»

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

Такое свободное (неправильное) использование Julian, вероятно, происходит от использования в астрономии и других областях дат отслеживания в виде непрерывного подсчета дней с полудня по всемирному времени 1 января 4713 г. до н. Юлианский календарь ). В настоящее время юлианская дата приближается к двум с половиной миллионам, 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 | 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.time

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

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

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

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

Где получить классы java.time?

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

...