美文网首页
中国传统历法-干支日速算问题

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

作者: 吕旭 | 来源:发表于2020-02-29 12:42 被阅读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月总天数的错误

    相关文章

      网友评论

          本文标题:中国传统历法-干支日速算问题

          本文链接:https://www.haomeiwen.com/subject/xrxphhtx.html