中国传统历法-干支日速算问题

2020-02-29  本文已影响0人  吕旭

之前那篇中国传统历法发出后,有人问我关于干支日速算的问题。

吕老师您好!看了您的一篇历法文章 …… 我正在研究干支记日,想请教现在流行的口诀(乘五除四九加日……)为什么要事先用年数减去1900呢。

在此统一做一个解答。

本文同时发布在我的个人博客简书 上。

干支日速算口诀

网上流传的口诀是这样的:

乘五除四九加日,
双月间隔三十天,
一二自加整少一,
三五七八十尾前。

口诀的解释

这个计算法,实际上就是找一个已知干支日的具体日期,然后算循环。

  1. 1900年1月1日是甲戌日,干支序数为11(假设一个1月0日,干支为序号10,方便计算,这样1月X日的干支序号就是X+10)。

  2. 乘五除四是因为一年365天,一年干支差5天,算上闰年每4年多差一天。这样算下来,就是当年1月1日和1900年1月1日干支的差值。需要注意的是,闰年润在2月,闰年当年的1月1日并不差闰年当年那一天,所以如果恰好除尽的话应该再减1。

  3. 得到当年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. 得到当月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

参考文献

  1. 知乎:日干支究竟如何与公历日期相互转换?
  2. 知乎:也许是最冷的电脑冷知识:1900年闰年Bug
  3. 微软社区:Excel 公历1900年2月总天数的错误
上一篇 下一篇

猜你喜欢

热点阅读