为什么润年阴历多一个月,阳历多一天?

1.查找星期几公式

周=[5+A(实际天数)] mod 7

2.主要分支计算公式

六十个分支的序号,从1->;59->;0。

六十家子分店序号=[23+A(实际天数)] mod 60

3.二十八、住宿计算公式

28住宿序列号=[23+A(实际天数)] mod 28

4.实际天数A的计算

A=B(基准日)+C(闰日)

B=(计算年-1)*365+(要计算的月、日、年的天数)

例:基本天数1984二月1 B =(1984-1)* 365+(31+1)= 723827(天),

其中31是10月的1天,1是2月的1天。

公元308年8月28日的基本天数。

b =(308-1)* 365+(31+28+31+30+31+27)= 110。

这里(计算一个月到一年的天数)用的是公历,一个月的天数规则好

就像我在小学学的一样。哈哈的笑...

C=(计算年份-1)div 4-误差修正值+固定值2

固定值2为0或1。常数值为0,当前年份数为闰年三月(公历闰年法)。

1天后是1。

误差修正值的计算:

65438+10月1到1582 65438+10月14的日期为0。

1582 65438+10月15到1699 65438+2月31是10。

从1701年1月1日开始,每一个世纪都会累加1,但能被400整除的世纪是不累的。

加上1。这个方法是可以计算的。

-有一个问题,1700这一年的修正值应该是多少?算法里什么都没有

有,但是好像是10。

例1701年1年10月1,误差修正值从1801年1年10月12,

而从1901年1月1日的误差修正值为13。

但是2001的纠错值还是13,因为2000年能被400整除,所以不累加。但是

误差修正值为101年1月1日。

5.例如:1998.3.15周,分支机构和28个招待所

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,2008年的雨季是14: 52。

分。

因为16:22+22:35 = 38:57 38-24 = 14。

谁知道公元元年到公元八年的节日,这个算法能不能实现。-很好

图像反演算法可以解决这个问题。谁来试试?

农历闰月算法:

农历二十四节气(十二节气、十二中气)的中气如果落在月末,就属于阴气。

从上个月开始我就没有中立过。农历以节气(节气)、无气(中气)为闰来定义这个月。

月份。19平均有7个闰月。

但是二十四节气中的十二节气和十二气是怎么划分的呢?我没有信息,

估计应该是节气和气过。:(

单位CNYear

连接

使用sysutils

type TCNDate = Cardinal

函数decodeggtocndate(dt Greg:TDateTime):TCN date;

功能

GetGregDateFromCN(cnYear,cnMonth,cn day:word;bLeap:Boolean=Fal

se):TDateTime;

函数GregDateToCNStr(dt Greg:TDateTime):String;

function isCNLeap(cn date:TCN date):boolean;

履行

const cstDateOrg:Integer = 32900;//t公历日期时间表1990-01-27

对应农历1990-01-01。

const cstcneyearorg = 1990;

const cstcnttable:array[cstcneyearorg..cstcneyearorg+60]of

WORD=( //无符号16位

24402, 3730, 3366, 13614, 2647, 35542, 858, 1749, //1997

23401, 1865, 1683, 19099, 1323, 2651, 10926, 1386, //2005

32213, 2980, 2889, 23891, 2709, 1325, 17757, 2741, //2013

39850, 1490, 3493, 61098, 3402, 3221, 19102, 1366, //2021

2773, 10970, 1746, 26469, 1829, 1611, 22103, 3243, //2029

1370, 13678, 2902, 48978, 2898, 2853, 60715, 2635, //2037

1195, 21179, 1453, 2922, 11690, 3474, 32421, 3365, //2045

2645, 55901, 1206, 1461, 14038);//2050

//建表方法:

//0101 110101010010上面四位是闰月位,最后12位代表大小月份,大月份是30。

天,流产29天,

//闰月一般认为是小月,但有三种特殊情况:2017/06,2036/06,2047/05。

//对于特殊情况,将四位闰月位置表示的最高位设置为1进行特殊处理。

使用wLeapNormal变量。

////2017/06 28330->;61098 2036/06 27947->;60715 2047/05

23133->;55901

//如果要用编译的话,这里有个信息:阴历不会比阳历落后2个月。

//将公历转换为农历

//返回:12位年份+4位月份+5位日期。

函数decodeggtocndate(dt Greg:TDateTime):TCN date;

定义变量

iDayLeave:Integer;

wYear,wMonth,wDay:WORD;

I,j:整数;

wBigSmallDist,wLeap,wCount,wLeapShift:WORD;

标签OK;

开始

结果:= 0;

iDayLeave:= Trunc(dt Greg)-cstDateOrg;

decode date(in month(dt Greg,-1),wYear,wMonth,wDay);

if(iday leave & lt;0)或(iDayLeave & gt22295)然后退出;

//引发异常。创建('目前只能算作1990-01-27 ');

//引发异常。创建('目前只能统计到2051-02-11 '之前);

for I:= Low(cstcnttable)到High(cstcnttable)开始

wBigSmallDist:= cstcnttable[I];

wLeap:= wBigSmallDist SHR 12;

如果wLeap & gt那就开始吧

wLeap := wLeap和7;

wLeapShift:= 1;

结束else

wLeapShift:= 0;

对于j:=1到12,请开始

wCount:=(wBigSmallDist和1)+29;

如果j=wLeap那么w count:= w count-wLeapShift;

如果iDayLeave & lt然后开始计数

结果:=(I SHL 9)+(j SHL 5)+iday leave+1;

退出;

结束;

iday leave:= iday leave-w count;

如果j=wLeap,则开始

wCount:= 29+wLeapShift;

如果iDayLeave & lt然后开始计数

结果:=(I SHL 9)+(j SHL 5)+iday leave+1+(1 SHL 21);

退出;

结束;

iday leave:= iday leave-w count;

结束;

wBigSmallDist := wBigSm