儒略日是一种从历元(公元前4713年1月1日正午世界时12时)开始连续纪日的历法
儒略历转儒略日
floor(365.25*(Y+4712))+int(30.6*(M+1))+D-63.5 (M>2)
当M<=2时:令Y = Y - 1,M = M + 12,可适用该公式
计算年
由于公元纪年法没有0年,天文学中以0表示公元前1年,则公元前4713年表示为-4712。
对儒略历而言,以365.25天为岁长,每年闰余0.25天,4年闰余积1天则需置闰。故儒略历每4年一闰。利用取整运算,可以在一个置闰周期中,每4年前3年向下取整,第四年进位。
floor((Y+4712)*365.25)
计算月
以13、14月表示上一年的1、2月(即一年只有3~14月)
7、8成为连大月,12、13也是连大月。其中8月与岁首相差5月,13月与8月也相差5月。
此时的大小月顺序仍然存在某种规律,即每连续5月,前4月大小月相间(从小月开始),然后是一次连大月。
即在一年12个月内,若以4月为岁首,则大小月按小大小大大循环排序。亦即连续5月的积月为153天(3大2小),平均每月为30.6天。则M月的积日为int(30.6*M)-31,由于该式是以3月为岁首,需调整月份,即令M=M+1,再减去多算的一月30,并需减去2月再减少的1天则有:
int(30.6*(M+1))-62 (M>2)
计算日
由于儒略日的历元是以正午12时开始(记为0.0),而公历一日之始以半夜12时开始(记为1.0),两种相差0.5天,则对日的积日为实际日数-1.5
D - 1.5
格里高利历转儒略日
floor(365.25*(Y+4712)) + int(30.6*(M+1)) + D - floor(Y/100)+floor(Y/400)+2 - 63.5 (M>2)
当M<=2时:令Y = Y - 1,M = M + 12,可适用该公式
JD = floor(365.25*(Y+4716)) + int(30.6001*(M+1)) + D + B - 1524.5 (M>2)
当M<=2时:令Y = Y - 1,M = M + 12,可适用该公式
对儒略历(公元前1582年10月4日及以前),有B = 0
对格里高利历(公元前1582年10月15日及以后),有B = 2 - floor(Y/100)+floor(Y/400)
if (year < 1900) {
return -1;
} else {
int il = 1 != month && 2 != month ? 0 : 1;
year -= 1900;
return 14956 + day + (int) ((double) ((float) (year - il)) * 365.25D) + (int) ((double) ((float) (month + 1 + il * 12)) * 30.6001D);
}
儒略日转格里高利历
以下是具体实现儒略历转格里高利历的代码
int y = (int) (((double) ((float) jd) - 15078.2D) / 365.25D);
int m = (int) (((double) ((float) jd) - 14956.1D - (double) ((int) ((double) ((float) y) * 365.25D))) / 30.6001D);
int d = jd - 14956 - (int) ((double) ((float) y) * 365.25D) - (int) ((double) ((float) m) * 30.6001D);
int k = m != 14 && m != 15 ? 0 : 1;
y = y + k + 1900;
m = m - 1 - k * 12;
int[] calendarDate = {y, m, d};