图(1)没有闰月情况下朔日与冬至节气关系图
图中上排数字是公历月的编号,黑色圆点代表朔日,黑色三角形代表冬至节气。图(2)显示了2012年有闰月的情况下朔日和冬至的关系:
图(2)有闰月情况下朔日与冬至节气关系图
表(2)2011年朔望月与公历日期关系表
编号为1和2的两个朔日之间的朔望月是十一月,因为冬至节气落在这个朔望月,其它月的月名依次类推,正月的朔日就是春节。输出公历和农历双历时,以月(公历)为单位,从每月第一天开始,依次判断每一天属于哪个朔望月,确定这一天的农历月名,然后比较这一天和这个朔望月的朔日之间相差几天,记为农历日期。以2011年1月1日为例,这一天在2010年12月6日(2010年农历十一月的朔日)和2011年1月4日之间(2010年农历十二月的朔日),查表(1)可知对应的农历月是十一月,这一天和2010年12月6日相差26天,因此这一天的农历日期就是“廿七”。再以2011年2月3日(春节)这一天为例,查朔望月表得知2月3日属于从2月3日开始的朔望月,这个朔望月的月名是正月,而2月3日就是月首,农历日期是初一,正月初一就是春节。
5doubleCalculateSolarTerms(intyear,intangle);
8doubleCalculateMoonShuoJD(doubletdJD);
生成指定公历年份的公历和农历的双历年历的流程如下:
图(3)计算公农历双历年历的流程
voidCChineseCalendar::GetAllSolarTermsJD(intyear,intstart,double*SolarTerms){inti=0;intst=start;while(i<25){doublejd=CalculateSolarTerms(year,st*15);if(st==WINTER_SOLSTICE){year++;}st=(st+1)%SOLAR_TERMS_COUNT;}}start参数是节气的索引,定义二十四节气的索引如下:
图(5)演示程序的界面
小知识1:民间历法和历理历法
小知识2:通式寿星公式
“通式寿星公式”是前人整理出来的一个用于计算每年立春日期的经验公式:
Date=向下取整(Y*D+C)-L
其中,Y是年份,D的值是0.2422,C是经验值,取决于节气和年份,对于21世纪,立春节气的C值是4.475,春分节气的C值是20.646等等;
L是闰年数,其计算公式为:
L=向下取整(Y/4)-向下取整(Y/100)+向下取整(Y/400)
用“通式寿星公式”确定2011年立春日期的过程如下:
L=int(2011/4)–int(2011/100)+int(2011/400)=502–20+5=487
Date=int(2011×0.2422+4.475)-487=491–487=4
所以,2011年的立春日期是2月4日。
小知识3:计算节气和朔日的经验公式
F=365.242*(y–1900)+6.2+15.22*x-1.9*sin(0.262*x)
其中x是节气的索引,0代表小寒,1代表大寒,其它节气按照顺序类推。
计算从1900年开始第m个朔日的公式是:
M=1.6+29.5306*m+0.4*sin(1-0.45058*m)
小知识4:平朔和定朔
小知识5:正月初一和立春节气
立春是二十四节气之首,所以古代民间都是在“立春”这一天过节,相当于现代的春节(中国古代即是节气也是节日的情况很多,比如清明、冬至等等)。农历年从正月初一开始没有争议,但是农历生肖年从何时开始却一直有争议,目前多数人都认为“立春”节气是农历生肖年的开始。因为在中国古代历法中,十二生肖的计算与天干地支有很大关系,所以在“论天干地支、计算廿四节气”的情况下,“立春”节气应该是新生肖的开始。对于普通老百姓来说,习惯于认为正月初一是生肖年的开始,因此,正月初一和“立春”节气之间出生的小孩,在确定属相的时候就有点麻烦了。属龙还是属蛇?这是个问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。