2、计算干支
计算年月日时干支的原理和计算星期差不多,因为其连续性,都可以用求余法来计算。不过中 国用来计算干支的年月概念和公历年月不同,年以立春为界,月以 12 节气为界,计算前公历的年 月需要转换成传统中国历法的年月。
1)年干支
计算年干支需要公历年月日三参数,无月日参数则默认认为是立春之后的某日,这样不需要调 整年份。如有月日参数,则判断其是否处于本年立春交节时刻之前,之前则属于去年,年份减一。 得到转换的年份后,假设为 Year,如其大于 0,则干支数为 (AYear 1 3) mod 60,其中 Year 1 为到公元 1 年的年份差,Year 为负数则根据无公元 0 年调整为 (AYear + 1 1 3) mod 60,这个 3 源于公元 1 年是辛酉年,而辛酉在六十花甲的 0 ~ 59 中排行 57。
2)月干支
公历月份的干支数虽可以用求余法来计算,不过因为一年的月份数等于地支数,和天干数的关 系也比较简单,因此有更简便的口诀算法(口诀来源于《新编万年历》一书,网上也有类似文章)。 首先仍然需要根据当年的立春和各个节气交节时刻来调整年月数,然后计算出本年干数,年干数和 本年首月月干数有口诀对应,这里把冗长的口诀简化了一下写在注释里,用代码描述如下:
case Gan of // 根据口诀从本年干数计算本年首月的干数
0,5: // 甲己 丙佐首,
Result := 2;
1,6: // 乙庚 戊为头,
Result := 4;
2,7: // 丙辛 寻庚起,
Result := 6;
3,8: // 丁壬 壬位流,
Result := 8;
4,9: // 戊癸 甲好求
Result := 0;
end;
现行农历沿用了夏历,规定正月为寅。得到首月的干支数后,便可序次推得该月干支数。
手册,免费。
3)日干支
日干支和星期的计算有类似之处,按星期计算的法子算得公元日数后,加 12 再对 60 取余则 得到当日的干支数,12 源于公元 1 月 0 日是丙子日,而丙子在六十花甲的 0 ~ 59 中排行
12。
4)时干支
一天 24 小时对应着 12 个时辰,时辰和干支对应,但时辰的分界却不严格对应着日的分界。 前一日 23 时到本日 1 时为子时,1 到 3 时为丑时,依此类推。时干支和月干支的计算类似,首 先根据小时数转成时辰数,如果是 23 时以后,则日期调整为后一天。接着计算出本日干数,本日 干数和本日子时干数也有简单的对应关系,不过这次没找到口诀,大概因为对应比较简单。此对应 关系用代码描述如下:
case Gan of
0,5:
Result := 0;
1,6:
Result := 2;
2,7:
Result := 4;
3,8:
Result := 6;
4,9:
Result := 8;
end;
可以简化成:
if Gan >= 5 then
Dec(Gan, 5);
Gan := 2 * Gan;
所以不需要口诀了。
得到子时干数后,便可序次推得本日内时辰的干支数。
3、计算节气
节气的定义虽然简单,可要计算出比较精确的交节时刻却并不容易,原因就是春分点在一回归 年内会有细微移动,所以太阳两次通过各个定气点的相隔时间并不是一精确回归年,便没法以 365.2422 日为周期来直接计算各个节气的时刻。CnCalendar 的算法移植自中国日历类中作者根 据曾次亮著作而拟合的节气算法,考虑到了地球自转的进动与章动,因此平气定气的精确度据作者 说能达到 10 分钟左右。
手册,免费。
4、计算星座
星座计算比较简单,仅仅根据月日就可以确定黄道十二宫的对应数值,规则如下:
01.20 - 02.18:水瓶座
02.19 - 03.20:双鱼座
03.21 - 04.20:白羊座
04.21 - 05.20:金牛座
05.21 - 06.21:双子座
06.22 - 07.22:巨蟹座
07.23 - 08.22:狮子座
08.23 - 09.22:处女座
09.23 - 10.22:天秤座
10.23 - 11.22:天蝎座
11.23 - 12.21:射手座
12.22 - 01.19:摩羯座
但黄道十二宫以白羊居首, 所以代码中返回的星座序号中 0 对应着白羊, 水瓶双鱼分别是 10、 11。
另外星座名称有不同说法,如摩羯又称山羊、水瓶又称宝瓶,射手又称人马、天秤又称天平等, 这里只采用比较常用的说法。
5、计算农历
1)农历历法详细规则
中国的农历在 1929 年以前以北京当地的经度 116°25′为计算基准,之后以北京时间也就 是东经 120°的东八区标准时间为计算基础。农历有四条基本规则:
1. 月朔时刻(定朔)所在之日定为农历月初一。
2. 如某节气交节时刻落于初一本日内(0 时后到 24 时前),即使其交节时刻早于月朔
时刻,也算落在此月中。
3. 冬至必须出现于农历十一月内。
4. 相邻的冬至交接时刻间(岁内)如出现 13 次月朔也就是 12 个完整的农历月,则此
岁称为闰岁,此岁中有一个月需要设置成闰月。因为期间必然有 12 个中气,所以至
少有一个农历月没有中气落入其中,闰岁内第一个没有中气的月份定为闰月,月份数
与前一月相同。
对于第四条规则,需要强调的是年内和岁内两个的概念是不同的,如出现岁内有两个农历月无 中气的情况,则以第一个为闰月,而此闰月可能不会落在本年内。而如果岁内有一农历月无中气但 本岁只有 12 次月朔也就是 11 个完整的农历月的情况下,那个无中气的月并不会被置闰。典型的 例子是 2033 年闰 11 月:2033 农历年第 8 个农历月和第 11 个农历月都无中气,但因为 2032 农历年冬至(11 月)到 2033 农历年冬至(11 月)间只有 11 个完整的农历月,所以不
手册,免费。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说公务员考试阴历算法CnCalendar(3)在线全文阅读。
相关推荐: