我在http://www.rgagnon.com/javadetails/java-0506.html看到了“解决方案” ,但它不能正常工作。例如昨天(6 月 8 日)应该是 159,但它说是 245。
那么,是否有人在 Java 中有解决方案来获取当前日期的三位数儒略日(不是儒略日 - 我需要今年的这一天)?
谢谢!标记
我在http://www.rgagnon.com/javadetails/java-0506.html看到了“解决方案” ,但它不能正常工作。例如昨天(6 月 8 日)应该是 159,但它说是 245。
那么,是否有人在 Java 中有解决方案来获取当前日期的三位数儒略日(不是儒略日 - 我需要今年的这一天)?
谢谢!标记
DateFormat d = new SimpleDateFormat("D");
System.out.println(d.format(date));
如果您只想要一年中的某一天,为什么不使用 GregorianCalendarsDAY_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,因为 1 月 1 日不是一年中的第 0 天:
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);
请注意,这没有考虑到您引用的那个奇怪网站声称的“中午开始”交易。当然,这可以通过检查时间来解决。
我已经阅读了所有的帖子,我认为有些东西不是很清楚。
user912567 提到了 Jean Meeus,他说的完全正确
我找到的最准确的定义是 Jean Meeus 在其“天文算法”一书中给出的(必须拥有,真的……)。
Julian Date 是一个日期,像往常一样用年、月和日表示。
Julian Day 是一个数字(实数),从 -4712 年开始计算,并且是“......天数的连续计数......”(和一天的分数)。用于精确天文计算的有用时间尺度。
Jean Meeus :“儒略日与儒略历无关”(“天文算法”,第 2 版,第 59 页)
如果我们得到一个双朱利安日期,例如 chordiant 决策经理
以下是有效的,但第二个没有处理 如何在 Java 日期和儒略日数之间进行转换?
公共静态字符串 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;
}
如果您正在寻找自 4713 BC 以来的天数中的 Julian Day ,那么您可以改用以下代码:
private static int daysSince1900(Date date) {
Calendar c = new GregorianCalendar();
c.setTime(date);
int year = c.get(Calendar.YEAR);
if (year < 1900 || year > 2099) {
throw new IllegalArgumentException("daysSince1900 - Date must be between 1900 and 2099");
}
year -= 1900;
int month = c.get(Calendar.MONTH) + 1;
int days = c.get(Calendar.DAY_OF_MONTH);
if (month < 3) {
month += 12;
year--;
}
int yearDays = (int) (year * 365.25);
int monthDays = (int) ((month + 1) * 30.61);
return (yearDays + monthDays + days - 63);
}
/**
* Get day count since Monday, January 1, 4713 BC
* https://en.wikipedia.org/wiki/Julian_day
* @param date
* @param time_of_day percentage past midnight, i.e. noon is 0.5
* @param timezone in hours, i.e. IST (+05:30) is 5.5
* @return
*/
private static double julianDay(Date date, double time_of_day, double timezone) {
return daysSince1900(date) + 2415018.5 + time_of_day - timezone / 24;
}
上述代码基于https://stackoverflow.com/a/9593736,因此仅限于 1900 年到 2099 年之间的日期。
在@Basil Bourque 回答之后,下面是我使用系统默认区域ID 获取一年中儒略日的实现。
LocalDate localDate = LocalDate.now(ZoneId.systemDefault());
int julianDay = localDate.getDayOfYear();
您还可以通过以下方式获取“朱利安日期”或“序号日期”:
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));
}
}