万年历的算法
万年历的计算公式

万年历的计算公式
日期的计算 例子 确定2049年10月1日(100周年国庆)为星期几,用Zeller 公式进行计算,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除以7余5) Zeller公式只适合1582年10月15日后的情形
万年历的计算公式
常识 平年365天(52周+1天),闰年366天(52周+2天)
平年2月28天,闰年2月29天
每400年一闰,或非百年年份每4年一闰
地球绕太阳一周的时间为365天5小时48分46秒, 规定一年365天,余下的时间,积累起来,4年共23 小时15分4秒,将近一天,把这一天加在某年的2月 而成29天,该年称为闰年,其他年份为平年。但4年 加1天又多用了44分56秒,这个数积满400年为3天。 因此400年中只能有97个闰年
万年历的计算公式
日期计算公式 Zeller公式 某日是星期几?关于这个问题,有很多计算公式(两 个通用计算公式和一些分段计算公式),其中最著名 的是Zeller公式: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 w:星期;c:世纪-1;y:年份(两位数);m:月份 (3≤m≤14,即在Zeller中,某年的1、2月要看作上一年 的13、14月,比如2003年1月1日要看作2002年的13月 1日);d:日数。 算出
万年历计算方法范文

万年历是一种可以计算从公元年到极远远的未来年月日的历法。
它是基于日、月、年的运动规律而设计的,可以帮助人们准确地计算和预测特定日期的周几和节气等信息。
下面将介绍万年历的计算方法。
首先,我们需要了解一个基本的概念,即闰年。
闰年是指在平年的基础上增加一个闰日(即2月29日)的一年。
根据公历的规定,每四年中有一个闰年,但是每100年中只有一个例外。
然而,每400年中又会有一个例外。
这种规律是为了与地球运行轨迹相符合,确保日历与季节的准确对应。
下面是万年历的具体计算步骤:1.首先确定一个基准年份,这个年份的万年历我们可以参考。
假设为1900年。
2.以基准年份的元旦(1月1日)为起点,计算基准年份中每一天是星期几(0代表星期天,1代表星期一,依次类推)。
3.根据基准年份中每个月的天数,计算每个月的起始日是星期几。
4.使用上述数据,以及基准年份已知的闰年信息,我们可以推断出基准年以后的任何一个年份,任何一个日期是星期几。
以上就是万年历的基本计算方法。
在实际应用中,我们可以借助计算机程序或者已经编制好的万年历来快速计算任何年份的日期与星期几。
万年历的计算方法并不复杂,但是对于非专业人士来说,理解其中的规律还是有一定难度的。
万年历在日常生活中有着广泛的应用。
它可以帮助我们了解历史事件发生的具体日期和星期几,方便我们做时间安排。
同时,万年历还可以用来预测特定日期的星期几,方便我们规划和安排各种活动。
总结起来,万年历是一种基于严格运动规律的历法,可以计算公历时间从公元年到非常遥远的未来。
它以闰年为基础,通过计算每年每月的起始日是星期几,来推断出特定日期是星期几。
万年历的计算方法虽然并不复杂,但是对于普通人来说,借助电子设备或者现成的万年历更为方便。
万年历算命算法

万年历算命算法
万年历算命算法有种方法,只需记住十四字的歌诀,一年中的干支纪时就可迅速算出。
这种快速心算万年历的方法,叫银盘子。
银盘子是民间术士创造的万年历速算法,历史悠久,以往采用师徒间口授方法传授,严禁外传。
银盘子歌诀如下:
戊子青牛廿六临,
玉兰金狗子上寻。
瞎子算命就是靠背诵的“银盘子”的,也叫“盲历”。
银盘子是以农历为基础,推算干支纪时的方法。
农历有大月、小月之分,大月天,小月天。
如果不考虑小月因素,农历两个月天,与一个甲子六十组干支数目相符,即每两个月可重合一个甲子。
按照这样一个规律,了某年的正月初一的日干支,就等于了三月初一,五月初一,七月初一,九月初一,十一月初一的日干支,这几个月的初一的日干支,应是相同的有闰月者,月分稍有变化因为农历中存在小月,只要某年有几个小月,其分别为哪几个月,所推日期经历了几个小月,干支纪日顺延几天就是了,这样心算干支纪日就变得十分简单了。
银盘于还将十天干用五色来代表:
甲乙青丙丁红
戊巳黄庚辛白
壬癸黑。
心算万年历,必须了解以下四个要点:该年岁次;正月初一的日干支;立春的日、时;当年几个小月,分别为哪几个月。
银盘子仅用了十四个字的歌诀,便将以上四个问题地解决了。
银盘子的创造者,为了保守秘密,在编制口诀时,采用了加密术,即对同一地支,往往采用多种称谓。
这样做,一是提供了多一些的音韵,使编出的歌诀押韵。
而更主要的是为这种心算法采取了加密。
同一地支众多称谓,变换使用,即便外人听到也不得其解。
网上万年历算法

x 100年: 000年 = 7 * 0 + 0 + 1 - 1 1 = 0 * 2 + 1 ****
100年 = 7 * 5217 + 7 + 1 - 2 2 = 1 * 2
{
int c=0;
float s;
int m;
for(m=1;m<month;m++)
c=c+month_day(year,m);
c=c+day;
s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400-40+c;
}
/*scanf("%*c");/*键入回车输出下一个月的日历*/
}
puts("=================================================================|");
puts("\n Press any key to quit...");
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;/*日期表置0*/
for(i=0;i<12;i++)/*一年十二个月*/
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
万年历计算方法

万年历计算方法1。
平年365天(52周+1天),闰年366天(52周+2天)。
平年2月28天,闰年2月29天。
由于公元1月1日设为星期六,故3月1日为星期三。
——注意这个“三”为使算法达到最简,故本算法以“星期”为计算单位。
且选3月1日为基月。
2。
每400年整一闰,或每4年且不为百年的一闰。
(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。
但四年加一天又多用了44分56秒,这个数积满400年为三天。
因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。
)所以百年%4=0闰或(年%4=0并且年<>0)闰。
3。
每 4年(3个平年+1个闰年)共208周+5天——注意这个“5天”每百年共100*(208周+5天)-1天=5217周+5天——注意这个“5天”(整百年暂设为平年)每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年)即400年一轮回!(原来万年历400年前是一家)蔡勒(Zeller)公式历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的蔡勒(Zeller)公式即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
(C是世纪数减一,y是年份后两位,M是月份,d是日数。
万年历原理

万年历原理
万年历是一种用来记录和显示日期的工具,它可以帮助人们方便地查看某一年、某一月或某一日的具体日期信息。
万年历的原理是基于公历的规律和历法计算。
公历是目前世界上最普遍使用的阳历,它采用太阳年和太阳日来计算时间。
太阳年的长度约为365.2425天,太阳日则是地
球绕太阳一周所需的时间。
然而,公历中规定的一年只有365天,为了弥补年与日之间的差距,每4年中会多出一个闰日,这一年就是闰年。
具体闰年的计算方法为:能被4整除但不能被100整除,或者能被400整除的年份都是闰年。
万年历的原理就是根据公历的规则计算某一天、某一月的具体日期,并配以星期的显示。
其中,星期的计算需要通过已知的起始日期和当天的天数差来确定,通常采用桥年法或詹森公式。
除了公历的基本原理,万年历还需要考虑其他因素,如月份的天数和每个月的起始日等。
一种广泛使用的万年历算法是蔡勒公式,它可以计算任意日期的星期、月份和日期。
根据这个算法,我们可以确定某一天是星期几,从而将日期显示在万年历上。
总之,万年历的原理是基于公历的规律和历法计算,它能够准确地显示任意日期的具体信息,帮助人们更方便地管理时间和安排日程。
新编万年历星期速算法

新编万年历星期速算法推导过程:1。
平年365天(52周+1天),闰年366天(52周+2天)。
平年2月28天,闰年2月29天。
由于公元1月1日设为星期六,故3月1日为星期三。
——注意这个“三”为使算法达到最简,故本算法以“星期”为计算单位。
且选3月1日为基月。
2。
每400年整一闰,或每4年且不为百年的一闰。
百年%4=0闰或(年%4=0并且年<>0)闰。
3。
每4年(3个平年+1个闰年)共208周+5天——注意这个“5天”每百年共100*(208周+5天)-1天=5217周+5天——注意这个“5天”(整百年暂设为平年)每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年)即400年一轮回!(原来万年历400年前是一家)4。
万年3月1日星期算法(记住那个三)公式:某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7 某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7或某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7闰4百年3月1日星期算法(百年%4=0)公式:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六平4百年3月1日星期算法(百年%4<>0)公式:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是闰年)9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一注:按400年一轮回!(400年前是一家)的说法1600年,2000年是一样的1700年,2100年是一样的1800年,2200年是一样的1900年,2300年是一样的所以,万年历实际上是骗人的,应该叫“四百年历”才是。
万年历工作原理

万年历工作原理
万年历是一种用来显示日期和周历的工具。
它的工作原理主要基于以下几个方面:
1. 年份计算:万年历首先需要通过一个算法来计算年份。
这个算法通常会考虑闰年的规律,以确定每一年是平年还是闰年。
根据阳历的计算方式,闰年一般为能够被4整除但不能被100
整除的年份,或者能够被400整除的年份。
2. 日期显示:万年历会通过一个日期显示系统,将当年的每一天以适当的格式呈现出来。
日期显示系统通常会将每个月的日期按照适当的行列进行排列,以方便用户查看。
3. 周日历显示:除了日期显示外,万年历还需要显示每周的日历。
这可以通过计算每个月的第一天是星期几,并据此确定每周的排列顺序来实现。
4. 补偿:由于历法的复杂性,万年历通常会考虑一些特殊情况,例如历法改革或历法规则的变化。
在这种情况下,万年历需要进行一些补偿或调整,以确保日期的准确性。
综上所述,万年历的工作原理主要包括年份的计算、日期的显示、周日历的显示以及一些特殊情况的补偿。
通过这些工作步骤,万年历可以准确地显示出任意年份的日期和周日历。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘自: 星期、干支、二十八宿计算公式打印本页关闭本窗口1. 求星期公式星期=[5+A(实际天数)] mod 72. 干支计算公式六十甲子干支序号,从1->59->0。
六十甲子干支序号=[23+A(实际天数)] mod 603. 二十八宿计算公式二十八宿序号=[23+A(实际天数)] mod 284. 实际天数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 -误差修正值+ fixValue2fixValue2为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. 实例:1998.3.15的星期、干支与二十八宿B=(1998-1)*365+(31+28+15)=728979C=(1998-1) div 4 - 13 + 0 = 486A=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年有七个闰月。
但二十四个节气的十二节气和十二中气是怎么分的呢?我没有资料,估记应该是一节气一中气这样交叉。
:(unit CNYear;interfaceuses sysutils;type TCNDate = Cardinal;function DecodeGregToCNDate(dtGreg:TDateTime):TCNDate;functionGetGregDateFromCN(cnYear,cnMonth,cnDay:word;bLeap:Boolean=Fal se):TDateTime;function GregDateToCNStr(dtGreg:TDateTime):String;function isCNLeap(cnDate:TCNDate):boolean;implementationconst cstDateOrg:Integer=32900; //公历1990-01-27的TDateTime表示对应农历1990-01-01const cstCNYearOrg=1990;const cstCNTable:array[cstCNYearOrg..cstCNYearOrg + 60] ofWORD=( // unsigned 16-bit24402, 3730, 3366, 13614, 2647, 35542, 858, 1749, //199723401, 1865, 1683, 19099, 1323, 2651, 10926, 1386, //200532213, 2980, 2889, 23891, 2709, 1325, 17757, 2741, //201339850, 1490, 3493, 61098, 3402, 3221, 19102, 1366, //20212773, 10970, 1746, 26469, 1829, 1611, 22103, 3243, //20291370, 13678, 2902, 48978, 2898, 2853, 60715, 2635, //20371195, 21179, 1453, 2922, 11690, 3474, 32421, 3365, //20452645, 55901, 1206, 1461, 14038); //2050//建表方法:// 0101 111101010010 高四位是闰月位置,后12位表示大小月,大月30 天,小月29天,//闰月一般算小月,但是有三个特例2017/06,2036/06,2047/05//对于特例则高四位的闰月位置表示法中的最高为设置为1 特殊处理用wLeapNormal变量// //2017/06 28330->61098 2036/06 27947->60715 2047/0523133->55901//如果希望用汇编,这里有一条信息:农历不会滞后公历2个月.//将公历转换为农历//返回:12位年份+4位月份+5位日期function DecodeGregToCNDate(dtGreg:TDateTime):TCNDate;variDayLeave:Integer;wYear,wMonth,wDay:WORD;i,j:integer;wBigSmallDist,wLeap,wCount,wLeapShift:WORD;label OK;beginresult := 0;iDayLeave := Trunc(dtGreg) - cstDateOrg;DecodeDate(IncMonth(dtGreg,-1),wYear,wMonth,wDay);if (iDayLeave < 0) or (iDayLeave > 22295 )then Exit;//Raise Exception.Create('目前只能算1990-01-27以后的');//Raise Exception.Create('目前只能算2051-02-11以前的');for i:=Low(cstCNTable) to High(cstCNTable) do begin wBigSmallDist := cstCNTable[i];wLeap := wBigSmallDist shr 12;if wLeap > 12 then beginwLeap := wLeap and 7;wLeapShift := 1;end elsewLeapShift := 0;for j:=1 to 12 do beginwCount:=(wBigSmallDist and 1) + 29;if j=wLeap then wCount := wCount - wLeapShift;if iDayLeave < wCount then beginResult := (i shl 9) + (j shl 5) + iDayLeave + 1;Exit;end;iDayLeave := iDayLeave - wCount;if j=wLeap then beginwCount:=29 + wLeapShift;if iDayLeave < wCount then beginResult := (i shl 9) + (j shl 5) + iDayLeave + 1 + (1 shl 21);Exit;end;iDayLeave := iDayLeave - wCount;end;wBigSmallDist := wBigSmallDist shr 1;end;end;//返回值:// 1位闰月标志+ 12位年份+4位月份+5位日期(共22位)end;function isCNLeap(cnDate:TCNDate):boolean;beginresult := (cnDate and $200000) <> 0;end;functionGetGregDateFromCN(cnYear,cnMonth,cnDay:word;bLeap:Boolean=Fal se):TDateTime;vari,j:integer;DayCount:integer;wBigSmallDist,wLeap,wLeapShift:WORD;begin// 0101 010********* 高四位是闰月位置,后12位表示大小月,大月30 天,小月29天,DayCount := 0;if (cnYear < 1990) or (cnYear >2050) then beginResult := 0;Exit;end;for i:= cstCNYearOrg to cnYear-1 do beginwBigSmallDist := cstCNTable[i];if (wBIgSmallDist and $F000) <> 0 then DayCount := DayCount +29;DayCount := DayCount + 12 * 29;for j:= 1 to 12 do beginDayCount := DayCount + wBigSmallDist and 1;wBigSmallDist := wBigSmallDist shr 1;end;end;wBigSmallDist := cstCNTable[cnYear];wLeap := wBigSmallDist shr 12;if wLeap > 12 then beginwLeap := wLeap and 7;wLeapShift := 1; //大月在闰月.end elsewLeapShift := 0;for j:= 1 to cnMonth-1 do beginDayCount:=DayCount + (wBigSmallDist and 1) + 29;if j=wLeap then DayCount := DayCount + 29; wBigSmallDist := wBigSmallDist shr 1;end;if bLeap and (cnMonth = wLeap) then //是要闰月的吗? DayCount := DayCount + 30 - wLeapShift;result := cstDateOrg + DayCount + cnDay - 1;end;//将日期显示成农历字符串.function GregDateToCNStr(dtGreg:TDateTime):String; const hzNumber:array[0..10] of string=('零','一','二','三',' 四','五','六','七','八','九','十');function ConvertYMD(Number:Word;YMD:Word):string; varwTmp:word;beginresult := '';if YMD = 1 then begin //年份while Number > 0 do beginresult := hzNumber[Number Mod 10] + result;Number := Number DIV 10;end;Exit;end;if Number<=10 then begin //可只用1位if YMD = 2 then //月份result := hzNumber[Number]else //天result := '初' + hzNumber[Number];Exit;end;wTmp := Number Mod 10; //个位if wTmp <> 0 then result := hzNumber[wTmp];wTmp := Number Div 10; //十位result:='十'+result;if wTmp > 1 then result := hzNumber[wTmp] + result;end;varcnYear,cnMonth,cnDay:word;cnDate:TCNDate;strLeap:string;begincnDate:= DecodeGregToCNDate(dtGreg);if cnDate = 0 then beginresult := '输入越界';Exit;end;cnDay := cnDate and $1F;cnMonth := (cnDate shr 5) and $F;cnYear := (cnDate shr 9) and $FFF;//测试第22位,为1表示闰月if isCNLeap(cnDate) then strLeap:='(闰)' else strLeap := ''; result := '农历' + ConvertYMD(cnYear,1) + '年' + ConvertYMD(cnMonth,2) + '月'+ strLeap + ConvertYMD(cnDay,3) ;end;end.。