高端送礼怎么选?十大专属品牌适配 VIP 正式场合
2026-06-17 19:57:26
浅说授时历
和为顺
【《授时历》自元至明末,行用364年,是古代版行最久的历法体系。元世祖忽必烈命许衡主持历局编制,郭守敬、王恂为副共同研订,太史院在全国开展四海测验,历时四年完成新历测算。该历确定回归年为365.2425日,与现行西历完全一样,但早于西方300余年。及至当今,授时历于民用历日推算,仍不失当年精度,还可以完全满足农历使用要求。】

下面是用授时历VBA程序做的2026年24节气推算,这是基于古代历法每个节气长度一样的平气法进行的推算,不要与当今采用西方定太阳黄道度的定气法进行比较。24节气是我国传统历法所特有的,西历不过只有二分二至罢了!
2026年 阳历共365天 |
冬至 甲子 17:20 |
小寒 己卯 22:34 |
大寒 乙未 03:49 |
立春 庚戌 09:04 |
雨水 乙丑 14:18 |
惊蛰 庚辰 19:33 |
春分 丙申 00:47 |
清明 辛亥 06:02 |
谷雨 丙寅 11:16 |
立夏 辛巳 16:31 |
小满 丙申 21:45 |
芒种 壬子 03:00 |
夏至 丁卯 08:14 |
小暑 壬午 13:29 |
大暑 丁酉 18:44 |
立秋 壬子 23:58 |
处暑 戊辰 05:13 |
白露 癸未 10:27 |
秋分 戊戌 15:42 |
寒露 癸丑 20:56 |
霜降 己巳 02:11 |
立冬 甲申 07:25 |
小雪 己亥 12:40 |
大雪 甲寅 17:55 |
冬至 己巳 23:09 |
下面是用授时历VBA程序做的2026年各月定朔推算,即新月的计算,也就是确定每月的初一。
要注意,无论24节气还是定朔,首先都是要推算出所求年年前的冬至,即所谓履始于端。
2026丙午马年 阴历共12月 355天 |
冬月大 癸亥 10:29 |
腊月小 癸巳 05:18 |
正月大 壬戌 21:12 |
二月小 壬辰 10:11 |
三月大 辛酉 20:26 |
四月小 辛卯 04:41 |
五月小 庚申 11:28 |
六月大 己丑 17:55 |
七月小 己未 01:41 |
八月小 戊子 11:21 |
九月大 丁巳 23:37 |
十月大 丁亥 14:43 |
冬月大 丁巳 08:51 |
腊月大 丁亥 05:08 |
正月小 丁巳 00:44 |
下面是寿星天文历对2026年的推算,将二者比较,可以看出定朔的日期是一样的。当然24节气的交节日期就不要比较了,前者是平气法,后者是定气法,前后会有一二日的差别。所以及至当今,授时历仍可用于民间历日的推算!
2026年
·十一大 癸亥 12-20 初二甲子冬至12-21 十七己卯小寒01-05
·十二小 癸巳 01-19 初二甲午大寒01-20 十七己酉立春02-04
·正月大 壬戌 02-17 初二癸亥雨水02-18 十七戊寅惊蛰03-05
·二月小 壬辰 03-19 初二癸巳春分03-20 十八己酉清明04-05
·三月大 辛酉 04-17 初四甲子谷雨04-20 十九己卯立夏05-05
·四月小 辛卯 05-17 初五乙未小满05-21 二十庚戌芒种06-05
·五月小 庚申 06-15 初七丙寅夏至06-21 廿三壬午小暑07-07
·六月大 己丑 07-14 初十戊戌大暑07-23 廿五癸丑立秋08-07
·七月小 己未 08-13 十一己巳处暑08-23 廿六甲申白露09-07
·八月小 戊子 09-11 十三庚子秋分09-23 廿八乙卯寒露10-08
·九月大 丁巳 10-10 十四庚午霜降10-23 廿九乙酉立冬11-07
·十月大 丁亥 11-09 十四庚子小雪11-22 廿九乙卯大雪12-07
【本文将带领大家一睹授时历的风采,去感受古代天文历法的魅力。自此文之后,我将陆续推出一系列历法推算的完整VBA源程序,有志于研究天文历法的同好,可以随时跟进。让我们为祖国的天文历法发展共同努力。】
【下文是《授时历经》第一篇的原文及注释,以清•《古今图书集成•历法典》为原本,<>内为原本注解,{}内为清•梅文鼎《历算全书》内容,【】内为本人添加内容及注释】
步气朔第一
至元十八年岁次辛巳为元。
上考往古,下验将来,皆距立元为算,周岁消长,百年各一,其诸应等数,随时推测,不用为元。
【至元十八年即公元1281年】
【基本数据】
【日周】
日周,一万。
【即1日,单位为分,当时的时间:一日=100刻,1刻=100分,1分=100秒,
1秒=100微。注意,并非现在所说的刻、分、秒,当时的一日为10000分,将其转化为现在的时间,就是当时的每分为现在的24x60x60/10000=8.64秒。】
【岁实】
岁实,三百六十五万二千四百二十五分。
【也叫“岁周”,即1个太阳回归年的长度。历法主要是为当世服务的,如果要推算100年之前或100年之后,需要考虑误差长期积累影响,为此就要修正岁实;修正岁实=岁实±INT(积年/100)=3652545±INT (积年/100),上推往古取正号,下算将来取负号】

【通余】
通余,五万二千四百二十五分。
【其实就是一年的零余,与“通盈分”相等,即岁实-360=5.2425日】
【朔实】
朔实,二十九万五千三百五分九十三秒。
【也叫“朔策”】

【通闰】
通闰,十万八千七百五十三分八十四秒。
【也叫岁闰,即岁实-12x朔实=365.2425-12x29.530593=10.875384日,即1个太阳年比12个月所多出的日数】
【岁周】
岁周,三百六十五日二千四百二十五分。
【就是岁实,单位不同】
【朔策】
朔策,二十九日五千三百五分九十三秒。
【就是朔实,单位不同】
【气策】
气策,十五日二千一百八十四分三十七秒半。
【平气法赋予每个节气的平均长度,即岁实/24=15.2184375日,半即五十微】
【望策】
望策,十四日七千六百五十二分九十六秒半。
【即朔策/2=14.7652965日,半即五十微。】
【弦策】
弦策,七日三千八百二十六分四十八秒少。
【即朔策/4=7.38264825日,少即二十五微。】
【气应】
气应,五十五万阙六百分。
【实测推算至元十八年(辛巳年)岁前冬至为己未日(农历庚辰年十一月二十一日)子正(即现在0点)夜半后6刻,距前甲子日(农历庚辰年九月二十五日)子正夜半已过去55.06日】
【闰应】
闰应,二十万一千八百五十分。
【实测推算至元十八年岁前冬至己未日子正(即现在的0点)距天正月(农历十一月初一戊戌日)合朔时刻,后来改为20.205日】
【没限】
没限,七千八百一十五分六十二秒半。
【即日周-气盈=10000-2184.375=7815.625分,亦即0.7815625日,半即五十微】
【气盈】
气盈,二千一百八十四分三十七秒半。
【即气策15.2184375-15=0.2184375日,即每个节气的零余之日,半即五十微】
【朔虚】
朔虚,四千六百九十四分阙七秒。
【其实说的是1月不满30日的零余,即30-朔策29.530593=0.469407日】
【旬周】
旬周,六十万。
【亦名纪法,即六十日】
【纪法】
纪法,六十。
【就是旬周,单位不同】
推天正冬至
置所求距算,以岁实<上推往古每百年长一,下算将来每百年消一>乘之,为中积;加气应为通积;满旬周去之;不尽,以日周约之为日,不满为分。其日命甲子算外,即所求天正冬至日辰及分。
如上考者,以气应减中积,满旬周去之;不尽,以减旬周。余同上。
{如迳求次年者,不拘有无闰月,并加通余五万二四二五,满纪法去之,即得。
通积分既从甲子起算,故满纪法去之,即知日辰也。算外命日辰者,以有小余也。算外命日辰者,以有小余也。凡满万分成一日者,为大余;九千分以下,皆为小余。大余为日,乃先一日之数。小余为时刻,乃为本日,故取算外也。}
【天正就是农历十一月,冬至一定是在农历十一月。周历建子,以农历十一月即冬至所在之月为岁首,古人以为得天之正,故称天正。天正亦指冬至】
【积年】
【积年=所求年距历元的积年数=所求年-1281
下算将来积年就是正值,上推往古积年就是负值。
所求距算就是积年,即从历元到所求年的累计年数,注意这个积年数,古历都是从历元之年年前冬至日开始进行推算的,所以从这个积年数推算的是所求年前面冬至日和农历十一月初一的相关数据。比如要推算2001年的日历,积年数就是2001-1281=720,其首先推算出的是2000年冬至日及其农历十一月初一的数据,然后再据此往后推算各个节气与各月的数据,直到2001年冬至日和农历十一月初一之前】
【中积】
【中积=积年x岁实365.2425
其实就是积日,即自历元年前冬至到所求年前冬至的累计日数。更为直接的是用通余5.2425乘以积年,因为前面的整数360日可以被60整除而略去】
【通积】
【通积=中积+气应55.06
即自历元年前冬至之前的甲子日零时到所求年前冬至的积日,古历以六十甲子的循环标记每日,所以要累积到前面甲子日0点,然后以60日取整,就知道所求某日的干支序数,也就知道某日的干支名称了,相当于知道如今的某月某日。
上推往古积年是负值,即中积是负值,所以上推往古的通积仍是中积+气应】
【求冬至的干支和时刻】
【冬至的干支和时刻=通积mod旬周60
大余,即整数+1就是冬至日的干支序数,以甲子为1
小余,即小数就是冬至交节的时刻
即从甲子日开始,数到整数+1就是冬至日的干支,小数就是冬至交节的时刻】
求次气
置天正冬至日分,以气策累加之,其日满纪法去之,外命如前,各得次气日辰及分秒。
【各节气的干支和时刻=(冬至的干支和时刻依次累加15.2184375日)mod60
即从冬至日开始,依次加上每个节气的平均长度,就可推算出各节气的干支以及交节的时刻,这是平气法得出的各节气干支和时刻,即以平气注历】
推天正经朔
置中积,加闰应,为闰积,满朔实去之,不尽为闰余,以减通积,为朔积,满旬周去之,不尽,以日周约之为日,不满为分,即所求天正经朔日及分秒。
{又法:置冬至内减闰余,即得经朔。如冬至小于闰余,不及减,加纪法六十万减之。【求天正经朔更简捷的方法,就是用上面求出的冬至大小余减去闰余,如果冬至大小余小于闰余,就把冬至大小余加上60后再减去闰余】
如迳求次年天正经朔者,无闰,加五十四万三六七一一六(十二朔实去纪法之数)。有闰,加二十三万八九七七○九(十三朔实去纪法之数),并满纪法去之即得。
朔者,日月同度之日。经者,常也。经朔者,朔之常数,所以别于定朔也。古人只用平朔,故日蚀或在晦。二唐以后始用定朔,则蚀必于朔。然不知经朔,则定朔无根,故必先求经朔。
先推通积分,自历元甲子日算至冬至,减去闰余,是从甲子日算至经朔,故去纪法,即得经朔之大小余也。
先推冬至分,是以纪法减过通积而得,乃冬至前甲子日距冬至数内减闰余,即为甲子日距经朔数也。
如冬至小于闰余,是此甲子日虽在冬至前,却在经朔后,故加纪法减之,是又从经朔前甲子算起也。}
【经朔:就是假定太阳、月亮作匀速运动时的合朔时刻。由经朔可以推求定朔,方法是:首先假定太阳、月亮作匀速圆周运动时,推算出二者黄经相同的时刻, 即所求月份的经朔时刻;而事实上太阳、月亮的运动是不均匀的,接着通过此时太阳、月亮偏离平均位置的数据求出日月不均匀性的改正,即日月改正数;将其加在经朔时刻上即可求得此月份的定朔时刻。该方法自《授时历》起广泛使用,提升了交食的预报精度】
【平朔:又称为“恒朔”。古代历法取月的平均日数约为29.5日,大月30日,小月29日,大小月相间,用这种方法推算出每月初一日,就叫“平朔”。上面的经朔也是平朔。清代钱大昕的《十驾斋养新录·置闰》里面说:“古法用平朔,率三十二月而一闰,间有相距三十三月者。唐、宋以来,皆有定朔,则或相距至三十四月。”】
上考者,以闰应减中积,满朔实去之,不尽,以减朔实,为闰余,以日周约之为日,不满为分,以减冬至日及分,不及减者,加纪法减之,命如上。
【闰积】
【闰积=中积+闰应20.205
即自历元年前十一月初一合朔时刻到所求年年前冬至交节时刻的积日】
【闰余】
【闰余=闰积mod朔实29.530593
也叫冬至月龄,就是当年各月的余分累计到天正月亦即十一月的日数和余分】
【朔积】
【朔积=通积-闰余】
【求天正经朔(十一月初一)的干支与时刻】
【天正经朔(十一月初一)的干支与时刻=朔积mod旬周60
整数+1就是十一月初一日的干支序数,小数就是十一月初一日的时刻
这里只是临时推算出粗略的平朔时刻,后面还要进行定朔时刻修正】
{求天正闰余分}
{置其年中积全分,加闰应二十○万二千○百五十分为闰积,以满朔实二十九万五千三百○五分九十三秒除之,为积月。其不满者,即为所求年天正闰余分也。闰余分满闰准一十八万六五五二○九者,其年有闰月。(补法:闰余满十六万八四二六四五以上者,其年有闰。如用闰准,须加两月闰)如迳求次年天正闰余者,不拘有无闰月,并加通闰一十○万八七五三八四,满朔策去之,即得。(如却求前岁闰者,置本年闰余,内减通闰得之。闰余小于通闰,不及减,加朔实减之即是)}
{闰余分者,乃岁前天正冬至距天正经朔数也。法当自辛巳历元天正经朔起算,故以闰应通之也。
闰准是朔实内去十二个月闰之数,若闰其年十一二月者,此法不能御,故有补法也。若于所得闰余分,加一万八千一百二十五分六四(两月闰之数),再用闰准取之,亦同。
附:经朔钤
一: 二九五三○五九三 【29530593】
二: 五九○六一一八六 【29530593x2】
三: 八八五九一七七九 【29530593x3】
四:一一八一二二三七二 【29530593x4】
五:一四七六五二九六五 【29530593x5】
六:一七七一八三五五八 【29530593x6】
七:二○六七一四一五一 【29530593x7】
八:二三六二四四七四四 【29530593x8】
九:二六五七七五三三七 【29530593x9】
百十万千百十分 秒
闰积内与经朔钤数同者,减去之,减至不满一朔实二十九万五三○五九三而止,其余数即闰余分。}【其实就是现在的取余函数,即闰积mod朔实,可见古代没有计算机算得多么累,真是佩服远古搞天文历算的人!】
【积月】
【积月=int(闰积/朔实29.530593)】
【月闰】
【月闰,九十刻六十二分八十二秒
即每月的闰余之日
月闰=通闰/12=10.875384/12
=2x气策-朔实=2x15.2184375-29.530593
=岁实/12-朔实=365.2424/12-29.530593
=0.906282日】
【闰准】
【闰准,十八日六十五刻五十二分九秒
闰准=朔实-通闰=29.530593-10.875384
=13x朔实-岁实=13x29.530593-365.2425
=18.655209日
当某年十一月闰余大余闰准时,这年就是闰年,就有13个月;将十一月的闰余往后每月累加月闰0.906282日,如加到某月时,其值大于朔实,该月即为闰月。以朔实29.530593减去闰余,所得结果再除以月闰0.906282,将所得整数加1,即为闰在从岁前十一月起的某月;这方法有很多不确定性,只是大概在那个月的前后,具体要以定朔作为标准】
{推闰月所在}
{置朔实(二十九万五三○五九三)内减去有闰之天正闰余全分,(即所推天正闰余在闰准以上者,其年有闰是也)余为实,以月闰九千○百六二八二为法除之,满法为月。视所得有几月,命起岁前十一月,算外,得闰在何月。此法仍多未的然,祇在其月之前后,皆以定朔为准也。“满法为月”者,满得一个月闰之数,即为一月。若满两个月闰,即为两月。此只求整月,不除分秒,故不必定子。}
本文及以后陆续推出的程序,均以VBA展示。只要你有office,只要你会用Excel,你就会使用VBA。
Follow me!你将收获满满!无论你是小白还是专家,终将会有所得!
《授时历》VBA推算程序
本次推出一些常数和辅助函数
关键的是函数GetDz( gyn ),输入任意公元年份,立即得到其年前冬至交节的日期和时刻!
快来试试吧!
以后所有程序保持同样风格,注释丰富,易读易懂!
&39;本程序主要参考郭守敬《授时历》原文及李勇、张培瑜《中国古历定朔推步综述》编制
&39;历史年代时日繁多,不能一一验算,也不能保证所有计算正确
&39;如果你在试用过程中发现任何问题,请不吝赐教,本人将尽量纠正并致谢回复
&39;
&39;朔实即朔望月B
Const SuiShi As Double = 365.2425 &39;近点月长(转终) B&39;转应
Const QiYing As Double = 55.06 &39;以1281年为历元,以1280年冬至交节时刻距前面农历十一月初一合朔时刻为闰应
Const RunZhun As Double = 18.655209 &39;YueRun=岁实A/12-朔实B=365.2425/12-29.530593=0.906282
Const QiCe As Double = SuiShi / 2439;气策,平气法赋予二十四节气每个节气的平均长度
Const PI As Double = 3.14159265358979
Const DEG2RAD As Double = PI / 18039; 角度转弧度
Const RAD2DEG As Double = 18039; 弧度转角度
&39;***替代Excel中Mod(a,b)的函数
Function TMod(ByVal A As Double, B As Double) As Double
TMod = A - B * Int(A / B)
End Function
&39;用平均岁实计算积日和时间较为准确
Function PjHgn(ByVal gyn As Integer) As Double &39;历元回归年长度,1281年为授时历历元
SqHgn = 365.24218968 - 0.0000000616 * (gyn - 2000) & &39;*** 用现代数据计算所求年的岁实,即归年长度
&39;Gyn为所求公元年
SqHgn = 365.24218968 - 0.0000000616 * (gyn - 2000) &39;*** 用现代数据计算从历元到所求年的平均朔实,即平均朔望月长度
Function PjSwy(ByVal gyn As Integer) As Double &39;历元朔望月长度,1281年为授时历历元
SqSwy = 29.53058885 + 0.0000000022 * (gyn - 2000) & &39;*** 用现代数据计算所求年的朔实,即朔望月长度
Function SqSwy(ByVal gyn As Integer) As Double &39;所求年朔望月长度,Gyn为所求公元年
End Function
&39;Gyn为所求公元年
SqJdy = 27.55454988 - 0.0000000104 * (gyn - 2000) &39;*** 用现代数据计算所求年闰准,Gyn为所求公元年
Function SqRz(ByVal gyn As Integer) As Double &39;所求年回归年长度,岁实
B = 29.53058885 + 0.0000000022 * (gyn - 2000) & * B - A &39;*** 用现代数据计算所求年月闰,Gyn为所求公元年
Function SqYr(ByVal gyn As Integer) As Double &39;所求年回归年长度,岁实
B = 29.53058885 + 0.0000000022 * (gyn - 2000) & - B &39;***授时历所求积年数的函数
&39;Gyn为所求公元年
Jns = gyn - 1281 &39;***求冬月闰余的函数
&39;授时历常数
Swy = ShuoShi &39;*** 计算所求年各朔入冬至点的积日数t,且t<=A,n=0为所求年天正经朔入冬至点的积日数t0
&39;授时历常数
Swy = ShuoShi &39;*** 计算所求年各朔入近点月的积日数t&39;<=B&39;
&39;授时历常数
Swy = ShuoShi &39; ***计算所求年年前平冬至
&39;古历都是从历元之年年前冬至日开始进行推算的,所以这个函数推算的是所求年年前冬至日的干支和时刻
&39;积年=所求年距历元的积年数=所求年-1281
Dim ZhongJi As Double, TongJi As Double, Hgn As Double
Hgn = SuiShi &39;中积=积年x岁实365.2425
TongJi = ZhongJi + QiYing &39;冬至的干支和时刻=通积mod旬周60
&39;小余,即上式求出的小数,就是冬至交节的时刻
'即从甲子日开始,数到整数+1就是冬至日的干支,小数就是冬至交节的时刻
GetDz = DongZhi
End Function
未完待续,和顺之小子倾情奉上!
2026春末于郑州
2026-06-17 19:57:26
2026-06-17 18:21:27
2026-06-17 17:33:28
2026-06-17 15:57:32
2026-06-17 15:09:28
2026-06-17 14:21:27
2026-06-17 13:35:26
2026-06-17 12:45:27
2026-06-17 11:57:28
2026-06-17 11:09:27
2026-06-17 10:21:27
2026-06-17 10:10:52
2026-06-17 08:45:28
2026-06-17 07:57:29
2026-06-17 07:09:30
2026-06-17 06:21:26
2026-06-17 04:45:31
2026-06-17 03:58:30
2026-06-17 03:09:30