为什么润年阴历多一个月,阳历多一天?
周=[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