之前那篇中国传统历法发出后,有人问我关于干支日速算的问题。
吕老师您好!看了您的一篇历法文章 …… 我正在研究干支记日,想请教现在流行的口诀(乘五除四九加日……)为什么要事先用年数减去1900呢。
在此统一做一个解答。
干支日速算口诀
网上流传的口诀是这样的:
乘五除四九加日,
双月间隔三十天,
一二自加整少一,
三五七八十尾前。
口诀的解释
这个计算法,实际上就是找一个已知干支日的具体日期,然后算循环。
1900年1月1日是甲戌日,干支序数为11(假设一个1月0日,干支为序号10,方便计算,这样1月X日的干支序号就是X+10)。
乘五除四是因为一年365天,一年干支差5天,算上闰年每4年多差一天。这样算下来,就是当年1月1日和1900年1月1日干支的差值。需要注意的是,闰年润在2月,闰年当年的1月1日并不差闰年当年那一天,所以如果恰好除尽的话应该再减1。
得到当年1月1日干支后,再算当前月1日和1月1日差几天。把当月之前的月份天数相加即可,如2月1日和1月1日差31天,4月1日和1月1日差(31+28+31)天,除60取余为30天。6月1日和1月1日差31+28+31+30+31+30天,相当于差1天。这就是所谓调整系数。要注意闰年2月多一天,当年调整系数都不一样。
- 得到当月1日的干支数,加上当天天数,就是当天干支数了。
我的公式:
10+(Y-1900)÷4❨取整,如除尽则再减1❩+(Y-1900)×5+月份调整系数+日期
得到的数字除60取余就是干支序号。
其实就是(基准干支序数+闰年差值+基本年初差值+月初差值+日期)/60 再取余数。
明白了这个道理,完全可以自己定义一个新的口诀,比如2000年1月1日是戊午日(干支序号55),以此为起点可以制定以下公式:
54+(Y-2000)÷4❨取整❩+(Y-2000)×5+月份调整系数+日期
这个公式比之前那个公式优美的地方在于2000年本身是闰年,算闰年的时候不必「除尽再减1」了。而且计算量也小。
用程序计算干支日
其实前面的公式那么复杂,又是平年闰年,又是调整系数的,只是因为人脑的计算力有限,无法直接算出两个日期之间相差多少天。如果用程序计算,两个日期之间的差值完全可以直接算出来,再加上基准日期干支,得到的数字除以60再取余,就是当前日期干支了。
用Excel来尝试计算:
在A1单元格里输入「2000/1/1」,在B1单元格里输入「1900/1/1」,C1单元格里输入公式=A1-B1
,在A4单元格里输入公式=MOD(C1+11,60)
,得出当日干支序号为56,即己未日。
尴尬的事情发生了,当天明明是戊午日,干支序号是55。公式应该是没有问题的为什么结果差了一天?
原来Excel当初为了兼容一个古老的BUG,将1900年也当成了闰年,导致计算日期差值的时候,用1900年3月之后的日期,减1900年2月底之前的日期,都会有1天的差值。
明白了这个原因,只要重新设置一个起点就好了。1900年4月20日为葵亥日,干支序数为60,也可以理解为0。
将B1单元格的日期改为「1900/4/20」,将A4单元格里的公式改为=MOD(C1,60)
,即可得到正确的干支序号55,即戊午日。
干支序数
十天干:
1 甲 2 乙 3 丙 4 丁 5 戊 6 己 7 庚 8 辛 9 壬 10 癸
十二地支:
1 子 2 丑 3 寅 4 卯 5 辰 6 巳 7 午 8 未 9 申 10 酉 11 戌 12 亥
干支序数:
01 甲子 11 甲戌 21 甲申 31 甲午 41 甲辰 51 甲寅
02 乙丑 12 乙亥 22 乙酉 32 乙未 42 乙巳 52 乙卯
03 丙寅 13 丙子 23 丙戌 33 丙申 43 丙午 53 丙辰
04 丁卯 14 丁丑 24 丁亥 34 丁酉 44 丁未 54 丁巳
05 戊辰 15 戊寅 25 戊子 35 戊戌 45 戊申 55 戊午
06 己巳 16 己卯 26 己丑 36 己亥 46 己酉 56 己未
07 庚午 17 庚辰 27 庚寅 37 庚子 47 庚戌 57 庚申
08 辛未 18 辛巳 28 辛卯 38 辛丑 48 辛亥 58 辛酉
09 壬申 19 壬午 29 壬辰 39 壬寅 49 壬子 59 壬戌
10 癸酉 20 癸未 30 癸巳 40 癸卯 50 癸丑 60 癸亥
月份调整系数
平年月份调整系数:
月份 | 调整系数 |
---|---|
1月 | 0 |
2月 | 31 |
3月 | 59 |
4月 | 30 |
5月 | 0 |
6月 | 31 |
7月 | 1 |
8月 | 32 |
9月 | 3 |
10月 | 33 |
11月 | 4 |
12月 | 34 |
闰年月份调整系数:
月份 | 调整系数 |
---|---|
1月 | 0 |
2月 | 31 |
3月 | 0 |
4月 | 31 |
5月 | 1 |
6月 | 32 |
7月 | 2 |
8月 | 32 |
9月 | 4 |
10月 | 34 |
11月 | 5 |
12月 | 35 |