天干地支:被玄学异化的古代周期历法(六)
文/孔述
(4)这里采用官方"万年历"
生成万年历,即公元124年至2103年间对应的天干地支。
先介绍制作方法,再说明使用方法。制作方法基本与上文相同。
O15=INDEX(MID("甲乙丙丁戊己庚辛壬癸",IF(MOD(ROW(A1),10)=0,10,MOD(ROW(A1),10)),1),,)&INDEX(MID("子丑寅卯辰巳午未申酉戌亥",MOD(ROW(A1)-1,12)+1,1),,)向下生成甲子、乙丑等干支组合。
P15=SEQUENCE(60,1,124,1)向下生成60个不间断的年号。
Q15=SEQUENCE(1,32,(P15+60),60)向左生成32个甲子年。
选定Q5到AV15整行下拉至第74行。1980年(从公元124年起近2000年)的表格数据自动生成,对应的天干地支也随之生成。
若要查询某年对应的天干地支,只需在表中查询即可。例如2018年的天干地支为"戊戌",位于图中坐标颜色交汇处。若查询1997年,则为"丁丑"。左边红色区域及右边AW16处也会自动显示为"丁丑",无需在表中逐一查找数据。
如何实现自动查询结果?为展示效果,放大局部视图。
AW19为输入查询的年份,年份下方设有滑动按钮,点击上下键可调整年份,点击下键变为1996年,此时系统立即查出1996年为"丙子"。此按钮功能在开发工具中通过链接控制,此处不作详细讲解。
P14=IFERROR(AJ15&"-"&(AK15-1),AJ15&"-")向右拖动至AV列,生成14行的一行区间数。
AW14=LOOKUP(AW19,P15:AV15,P14:AV14)查询所查年份所在的区间
AW16=INDEX(O15:O74,MATCH(AW19,AX15:AX74,0))查询对应的天干地支
AX15=CHOOSECOLS(P15:AV74,MATCH(AW14,P14:AV14,0))所查年份所在的列
上表中所有颜色部分均通过条件格式自动标注,此处不作详细介绍。
现如查询1781年
很多人会问,是否可以随时随地使用这个万年历,这与古人使用一本翻破了的万年历有何区别?无需万年历又该如何计算呢?关键在于如何计算年、月、日、时这四柱对应的天干地支,也就是人们常说的"四柱"。
下面介绍"四柱"的具体计算方法:
(5)年干柱的计算:
(6)先查看下表
B3、C3、D3、E3 分别为需要计算和查询的年、月、日、时。D4、D5分别为对应的年干、年支,E4为结果。合显示。同理,E9、E15、E8分别为月、日、时干支,F5为万年历中自动查询的结果。例如2026年自动查询显示为"丙午",与计算结果一致。当E5正确时显示√并高亮,错误时会警示。目前状态为√。
C4=IF(MOD(B3-3,10)=0,10,MOD(B3-3,10)) 计算年干数
C5=IF(MOD(B3-3,12)=0,MOD(B3-3,12)+12,MOD(B3-3,12)) 计算年支数
D4=INDEX(数据基础!B2:K2,MATCH(C4,数据基础!B1:K1,)) 自动查询年干
D5=INDEX(数据基础!B5:M5,MATCH(C5,数据基础!B1:M1,)) 自动查询年支
E4=D4&D5 年干支组合
F3=INDEX(对照表!H:H,MATCH(B7,对照表!A:A,)) 查询当年的阴历月
C6=IFS(C3=1,13,C3=2,14,OR(C3=3,C3=4,C3=5,C3=6,C3=7,C3=8,C3=9,C3=10,C3=11,C3=12),C3)
计算日支需用的数据
C9=IF(MOD(C8*2+F3,10)=0,10,MOD(C8*2+F3,10)) 计算月干数
D9=INDEX(数据基础!B2:K2,MATCH(C9,数据基础!B1:K1,)) 计算月干
D10=INDEX(数据基础!B9:M9,MATCH(F3,数据基础!B1:M1,)) 计算月支 需用到阴历月
E9=D9&D10 月干支组合
日干支计算比较复杂:
C、Y、M、D 分别表示世纪(前两位2021为20)、年份(后两位21)、月、日。例如2026年6月初5。
且月份需要判断奇偶:
F2=IF(MOD(C3,2)=0,6,0)
C15=IF(MOD(4*B14+INT(B14/4)+5*C14+INT(C14/4)+INT(3*(C6+1)/5)+F14-3,10)=0,10,MOD(4*B14+INT(B14/4)+5*C14+INT(C14/4)+INT(3*(C6+1)/5)+F14-3,10)) 计算日干数
C16=IF(MOD(8*B14+INT(B14/4)+5*C14+INT(C14/4)+INT(3*(C6+1)/5)+F14+7+F12,12)=0,12,MOD(8*B14+INT(B14/4)+5*C14+INT(C14/4)+INT(3*(C6+1)/5)+F14+7+F12,12)) 计算日支数
以上计算均需要用到前面"算日支需用"的数据。
D15=IF(INDEX(数据基础!B2:K2,MATCH(C15,数据基础!B1:K1,))=0,10,INDEX(数据基础!B2:K2,MATCH(C15,数据基础!B1:K1,))) 自动计算日干
D16=IF(INDEX(数据基础!B5:M5,MATCH(C16,数据基础!B1:M1,))=0,12,INDEX(数据基础!B5:M5,MATCH(C16,数据基础!B1:M1,))) 自动计算日支
时干支需要用到日干数、"时对应的干表"和对应的"时辰表"C18=INDEX(C21:C30,MATCH(D15,B21:B30,))生成时干
C19=INDEX(D33:D44,MATCH(F19,C33:C44,))生成时支
(7)阳历、阴历对照表:此对照表基本按沿袭的农历生成,主要用于上面计算月干支时需要用到阴历月。
仅就几个公式简单介绍:
D2=TEXT(A2,"yyyy-mm")转成公历年计算方式
E2=RIGHT(C2,LEN(C2)-FIND("年",C2)) 提取农历月日,便于后期对照计算月支
G2=@SWITCH(TRUE,MID(C2,SEARCH("年",C2)+LEN("年"),SEARCH("月",C2)-SEARCH("年",C2)-LEN("年"))="正","一",MID(C2,SEARCH("年",C2)+LEN("年"),SEARCH("月",C2)-SEARCH("年",C2)-LEN("年"))="腊","十二",MID(C2,SEARCH("年",C2)+LEN("年"),SEARCH("月",C2)-SEARCH("年",C2)-LEN("年"))) 提取农历大写月,因为出现"正"、"腊"月需要转换为可计算的数字,故还需转换为对应的小写数字。
I2=BYROW(E2:E73001,LAMBDA(x,IF(ISNUMBER(SEARCH("闰",x)),"闰",""))) 显示有闰月并高显红色,用于月支推算
有闰月的部分年份四年一闰局部
如果要继续随机查询,只需输入对应年月时辰,结果瞬间显示。
注意输入时辰会自动选择对应的"时支"并高显红色,
G32=--TEXT(E3,"HH") 即把带分的时间转为整时数,
F33=LOOKUP(G32,E33:E44,C33:C44) 根据整时数自动查到对应的时支。
至此,四柱计算出来了。注意,这里只是介绍基础算法,因为社会上各种计算规则不同,可能会有计算偏差。
此外,阴历、阳历存在区别,但称呼习惯不同而已。老黄历上的吉凶等只要熟悉规则,亦可函数计算。授予人以鱼不如授人以渔,主要介绍方法。欢迎各位方家及有兴趣的朋友交流、指正。