Джулианский день года в Java
-
25-09-2019 - |
Вопрос
Я видел «решение» в http://www.rgagnon.com/javadetails/java-0506.html., но это не работает правильно. Например, вчерашний день (8 июня) должно было быть 159 лет, но он сказал, что это было 245.
Итак, у кого-то есть решение в Java для получения трехзначного Джулиана Джулиана Джулианской даты (не Джулиана - мне нужен день в этом году)?
Спасибо! отметка
Решение
Если все, что вы хотите, это день год, почему дон не просто использовать григорианкалендари 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 Recial Manager
Следующее работает, но вторым не позаботится оКак я могу конвертировать между датой 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;
}
Я прочитал все сообщения и что-то не очень ясно, я думаю.
User912567 упоминается Джин Миус, и он абсолютно прав
Наиболее точное определение, которое я обнаружил, дается Жан Meeus в его книге «Астрономические алгоритмы» (Действительно ...).
Джулианская дата Дата, выраженные как обычно, с годом, месяц и день.
Джулианский день количество (Настоящее число), считается из года -4712 и "... непрерывное количество дней ..." (и доля дня). А. полезно Шкала времени, используемая для точных астрономических расчетов.
Жан Миус: «Джулианский день не имеет ничего общего с Джулианским календарем» («Астрономические алгоритмы», 2-е издание, с.59)
TL; доктор
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 Framework, встроенная в 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?
- 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 Bundle Aflations Java.Time классов.
- Для ранее Android (<26), Threetenabp. Адапты проекта Threeten-Backport. (упомянутый выше). Видеть Как использовать THRETENABP ....
То Threeten-Extra Проект расширяет Java.Time с дополнительными классами. Этот проект является доказательством для возможных будущих дополнений в Java.Time. Вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
, а также более.
Вы также можете получить «Джулианскую дату» или «порядковый день» таким образом:
import java.util.Calendar;
import java.util.Date;
public class MyClass {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
LocalDate myObj = LocalDate.now();
System.out.println(myObj);
System.out.println("Julian Date:" + cal.get(Calendar.DAY_OF_YEAR));
}
}