Юлианский день года на Яве
Я видел "решение" в 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());
import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
обратите внимание, что это не учитывает сделку "начинается в полдень", заявленную тем странным сайтом, на который вы ссылались. Это можно исправить, просто проверив время, конечно.
если мы получим двойной юлианская дата, такие как решения chordiant менеджер
следующее работает, но второе не заботится о как я могу конвертировать между датой 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
и больше.