儒略历

儒略日是一种从历元(公元前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};
发布了51 篇原创文章 · 获赞 0 · 访问量 742

猜你喜欢

转载自blog.csdn.net/lxy1740/article/details/104307031