摘自: 礼拜、干支、二十八宿计算公式 打印本页 关闭本窗口 1. 求礼拜公式 礼拜=[5+A(实际天数)] mod 7 2. 干支计算公式 六十甲子干支序号,从1->59->0。 六十甲子干支序号=[23+A(实际天数)] mod 60 3. 二十八宿计算公式 二十八宿序号=[23+A(实际天数)] mod 28 4. 实际天数A的计算 A=B(大体天数)+C(闰日天数) B=(计算年-1)*365+(要计算到年的月日天数) 例:1984年2月1日的大体天数B=(1984-1)*365+(31+1)=723827(天), 其中,31是1月为31天,1为2月1日为1天。 公元308年8月28日的大体天数 B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天) 那个地址的(要计算到年的月日天数),用的是公历,月日天数的规那么我好 象小学就学过了。哈哈…… C=(计算年-1) div 4 -误差修正值 + fixValue2 fixValue2为0或1。常值为0,昔时数为闰年(公历闰年法)当中的3月 1日以后的为1。 误差修正值推算: 公元元年1月1日至1582年10月14日为0。 1582年10月15日至1699年12月31日为10。 从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累 加1。此方式推算即可。 --有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有 讲到,但看来应该是10。 例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12, 而1901年1月1日起误差修正值为13, 但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。而 2101年1月1日起误差修正值为14。 5. 实例:的礼拜、干支与二十八宿 B=(1998-1)*365+(31+28+15)=728979 C=(1998-1) div 4 - 13 + 0 = 486 A=B+C=728979+486=729465 礼拜序号=(5+729465) mod 7=0,即为礼拜日 干支序号=(13+729465) mod 60=58,即为辛酉 二十八宿序号=(23+729465) mod 28=4,即为房 =================================================== 好恐怖!还有一些其它公式……但好象有些参数不明白怎么取得: 二十四节交节日算法: 用已知年的交接时辰加上22个小时35分,超过24要减去24,分数足60 进1个小时,即取得8年后的各节交节时辰。 如2000年雨水交节时辰为16时22分,那么2020年雨水交节时辰为14时52 分。 因为16时22分+22时35分=38时57分。38-24=14时。 谁明白公元元年到公元八年的交节日,那个算法就能够够实现了。--好 象逆算法能够解决那个问题。谁试试? 农历闰月算法: 农历中,二十四骨气(十二骨气和十二中气)的中气落在月末的话,下 个月就没有中气。农历将这种有节(骨气)无气(中气)的月份规定为闰 月。平均计算,19年有七个闰月。 但二十四个骨气的十二骨气和十二中气是怎么分的呢?我没有资料, 估记应该是一骨气一中气如此交叉。 :( unit CNYear; interface uses sysutils; type TCNDate = Cardinal; function DecodeGregToCNDate(dtGreg:TDateTime):TCNDate; function GetGregDateFromCN(cnYear,cnMonth,cnDay:word;bLeap:Boolean=Fal se):TDateTime; function GregDateToCNStr(dtGreg:TDateTime):String; function isCNLeap(cnDate:TCNDate):boolean; implementation const cstDateOrg:Integer=32900; 1990-01-27农历1990-01-01cstCNYearOrg + 60] of WORD=( 1990-01-272051-02-11 end else wLeapShift := 0; for j:= 1 to cnMonth-1 do begin DayCount:=DayCount + (wBigSmallDist and 1) + 29; if j=wLeap then DayCount := DayCount + 29; wBigSmallDist := wBigSmallDist shr 1; end; if bLeap and (cnMonth = wLeap) then function GregDateToCNStr(dtGreg:TDateTime):String; const hzNumber:array[0..10] of string=('零','一','二','三',' 四','五','六','七','八','九','十'); function ConvertYMD(Number:Word;YMD:Word):string; var wTmp:word; begin result := ''; if YMD = 1 then begin 1F 本文来源:https://www.wddqw.com/doc/810c63552a4ac850ad02de80d4d8d15abf2300ee.html