干支纪年和纪日算法(优秀)_干支纪年和纪日算法
干支纪年和纪日算法(优秀)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“干支纪年和纪日算法”。
干支纪年和纪日算法(怎样从已知年份和日期得到对应的干支纪年和纪日)摘要:
从已知年份计算干支纪年很简单:年份数减3,除以10的余数是天干,除以12的余数是地支。
从已知日期计算干支纪日的公式和蔡勒公式很相像,如下:
g = 4C + [C/4] + 5y + [y/4] + [3*(M+1)/ 5] + d5 * 7(mod 60)= 55,即戊午的序号是55.这和上面的对照表的是一致的。一般地,若天干的序号为m,地支的序号为n,则干支的序号为:
x ≡ 6m[(Y-1)/100] + [(Y-1)/400] + D + 15,(3)
其中Y是年份,D是累积天数,[...]表示取商数,也就是只取计算结果的整数部分。把G除以60,余数就是干支的序号。或者把G除以10或12,可以直接得到日天干和日地支。不过,和形式相似的求星期的公式一样,这个公式还不够简炼,特别是第一项(Y-1)*5,在Y为四位数年份时,计算出来的结果是一个较大的四位数或五位数,口算很不方便。
我们用推导蔡勒公式的办法,可以改进这个公式。先来看和年份有关的部分的改进。我们知道,按公历的置闰规则,一个世纪的总天数可能是36524天,或36525天。如果这个世纪中末尾为00的年份是闰年,这个世纪就只有36525天;否则就只有36524天。我们不妨称有36524天的世纪为“平世纪”,有36525天的世纪为“闰世纪”。对于平世纪,因为
36524 mod 60 = 44,所以,每过一个平世纪,同一天的干支就向后推进44个序号。同样,每过一个闰世纪,同一天的干支就向后推进45个序号。这就使我们很容易得到一个计算每个世纪第一年(年份末尾为01)3月1日的公式:
G = 44C + [C/4] + 15,(4)
其中C是世纪数减一。
而计算任一年3月1日的干支的公式也可以很快得到:
G = 44C + [C/4] + 5(y-1)+ [y/4] + 15,即
G = 44C + [C/4] + 5y + [y/4] + 10,(5)
其中y是年份后两位数字。
下面我们再列出每月天数:
月
份 1月 2月
3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
-------------天
数
28(29)31 30 31 30 31 31 30 31 30 31 减30后的剩余天数 1-2(-1)1 0 1 0 1 1 0 1 0 1
如果把1月和2月看成是上一年的13月和14月,同样可以得到下面的式子:
D’ ≡ [3*(M+1)/ 5] + d2 + i(mod 12)(奇数月i=0,偶数月i=6),(7)
其中,D’是从3月1日开始算起的累积天数,M是月份,d是日数。把(6)(7)两式和(5)式合起来,再进行适当的化简,就得到了计算公历任意一天的天干和地支的公式:
g = 4C + [C/4] + 5y + [y/4] + [3*(M+1)/ 5] + d1,可以看出它们的形式非常相似,区别仅仅是几个常数的不同。
尽管现在中国已经不用干支纪日了,但有时还是需要计算日干支的。比如,历法有所谓“三伏”和“入梅”“出梅”,都和日干支有关。三伏包括初伏、中伏和末伏,是指夏天最热的一段时间,入梅和出梅是指江南一带梅雨季节的开始和结束,本来是和气候有关的用语。但因为古代没有准确的天气预报,无法准确预测三伏和入出梅的时间,所以就在历书上硬性规定几个日子作为三伏开始和入出梅的日子,这样确定一个大致的日期以备参考。现在虽然有了比较准确的天气预报,但三伏和入出梅作为一种传统历法,仍然流传下来。
历法规定夏至之后的第三个庚日为初伏开始,共十天;第四个庚日为中伏开始,十天或二十天;立秋之后的第一个庚日为末伏开始,共十天。中伏的长度之所以不固定,是因为夏至、立秋的日期和庚日的日期是逐年浮动的,立秋之后的第一个庚日可能是夏至之后的第五个庚日,也可能是第六个庚日。如果是前者,中伏就只有十天;如果是后者,中伏就长达二十天。注意如果夏至当天是庚日,夏至之后第一个庚日是指夏至之后第十天,而不是夏至当天,这时初伏第一天就是夏至之后第三十天。同样,如果立秋当天是庚日,末伏第一天就是立秋之后第十天,而不是立秋当天。入梅则是指芒种之后的第一个丙日,出梅是指小暑之后的第一个未日,也有同样的规定。
知道了这些,我们可以算一下2004年的初伏、中伏和末伏都是什么日子。这需要先知道夏至和立秋的日子。如果知道夏至是6月21日,立秋是8月7日,那么运用公式(8),夏至这天的g为:
g = 4 * 20 + [20/4] + 5*4 + [4/4] + [3*(6+1)/ 5] + 213 = 128,个位数是8,天干是辛。夏至之后第三个庚日就是夏至之后第29天,也就是7月20日,这天也就是初伏第一天。中伏第一天则是7月30日。同样可算出立秋这天的g为:
g = 4 * 20 + [20/4] + 5*4 + [4/4] + [3*(8+1)/ 5] + 73 = 115,是个戊日。立秋之后第一个庚日就是立秋之后第2天,也即8月9日,这天就是末伏第一天。由此也可知,2004年的中伏只有十天。同样可以由芒种和小暑两节气的日期,算出2004年的入梅日和出梅日分别是6月6日和7月15日。
反过来,知道了年干支和日干支,求相应的年份和日期就相对麻烦一点了。因为干支是循环使用的,所以必须先知道欲求对应年份和日期的干支是属于哪一次循环。比如我们预先用公式(2)算出来1864、1924、1984年都是甲子年,如果要知道戊戌变法是哪一年,首先要确定它是十九世纪末的事情,也即是属于1864年开始的这一个循环里。那么,我们用公式(1)可以算出来戊戌的序号是35,于是戊戌年就是(1864-1)+35=1898年。之所以要先减一,是因为甲子的序号为1,需要把这个序号先减去。
至于日干支,因为古书里的日干支总是和年、月配合使用的,所以不难确定它属于哪个循环。比如《明史·庄烈帝本纪》记载明崇祯皇帝朱由检在煤山自缢的日子是崇祯十六年三月丁未。崇祯十六年就是公元1644年。三月虽然是农历的三月,但我们知道农历的日期在公历里虽然是浮动的,但也不出一定的范围,比如农历三月初一,总是在公历3月22日到4月19日之间浮动。因此,先来算1644年3月22日的干支。我们有:
g = 4 * 16 + [16/4] + 5 * 44 + [44/4] + [3*(3+1)/ 5] + 223 = 320,个位数是0,z = g + 4C + 10 = 320 + 64 + 10 = 394,除以12余10,所以这一天的干支是癸酉,其序号为6*0-5*10+60=10。而丁未的序号是6*4-5*8+60=44,在癸未之后34天,因此三月丁未肯定是3月22日之后34天,即4月25日。这就是说,崇祯自缢的日子是1644年4月25日,这和查万年历的结果是一致的。