万年历算法

时间:2022-10-04 23:49:12 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
摘自: 礼拜、干支、二十八宿计算公式 打印本页 关闭本窗口 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+(要计算到年的月日天数)

例:198421日的大体天数B=(1984-1)*365+(31+1)=723827() 其中,311月为31天,121日为1天。 公元308828日的大体天数

B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294()

那个地址的(要计算到年的月日天数),用的是公历,月日天数的规那么我好 象小学就学过了。哈哈……

C=(计算年-1) div 4 -误差修正值 + fixValue2

fixValue201。常值为0,昔时数为闰年(公历闰年法)当中的3 1日以后的为1

误差修正值推算:

公元元年11日至15821014日为0 15821015日至16991231日为10

170111日起每增加一个世纪累加1,但能被400除尽的世纪不累 1。此方式推算即可。

--有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有 讲到,但看来应该是10

170111日起误差值为11,而180111日起误差修正值为12 190111日起误差修正值为13

2001年误差修正值仍为13,因为2000年能被400整除,故不累加。而 210111日起误差修正值为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年雨水交节时辰为1622分,那么2020年雨水交节时辰为1452 分。

因为1622+2235=3857分。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