Юлианский день года в Java
Я видел "решение" на http://www.rgagnon.com/javadetails/java-0506.html, но он работает неправильно. Например. вчера (8 июня) должно было быть 159, но он сказал, что это 245.
Итак, у кого-то есть решение на Java для получения текущей даты трехзначного юлианского дня (а не юлианской даты - мне нужен день в этом году)?
Спасибо! Марк
Ответы
Ответ 1
Если все, что вам нужно, это день года, почему бы вам не использовать поле 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());
Ответ 2
DateFormat d = new SimpleDateFormat("D");
System.out.println(d.format(date));
Ответ 3
import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
Обратите внимание, что это не учитывает сделку "начинается в полдень", на которую ссылается тот странный сайт, на который вы ссылались. Это можно было бы исправить, просто проверив время, конечно.
Ответ 4
если мы получим двойную юлианскую дату, такую как хордиантный менеджер решений
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 (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;
}
Ответ 5
Я читал все сообщения и что-то не очень ясное, думаю.
user912567 упоминает Жан Миуса, и он абсолютно прав
Самое точное определение, которое я нашел, дано Жаном Миусом в его книге "Астрономические алгоритмы" (должно быть, действительно...).
Юлианская дата - это дата, выраженная как обычно, с годом, месяцем и днем.
Юлианский день - это номер (действительное число), отсчитываемый с года -4712 и "... непрерывное количество дней..." (и часть дня).
полезный временной шкал, используемый для точных астрономических расчетов.
Жан Миус: "Юлианский день не имеет ничего общего с юлианским календарем" ( "Астрономические алгоритмы", 2-е издание, с .59)
Ответ 6
ТЛ; др
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 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 7
Вы можете посмотреть мое объяснение о расчете юлианской даты. https://www.koraygecici.com/en/java-articles/7-number-of-days-between-2-dates-algorithim
Ответ 8
Вы также можете получить "Юлианскую дату" или "Порядковую дату" следующим образом:
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));
}
}