万年历算法
不用万年历快速推算四柱干支揭秘

不用万年历快速推算四柱干支揭秘卜魂居士整编以前要知道某一天的天干地支最便捷的的方法就是带一本万年历,但不同版本万年历有时天干地支会有相差,历史上就有过对照万年历排八字由于不同版本而引起争议的事例,如《民国易坛奇才----瞎子王传奇》中就有最典型的事例。
如果没有万年历怎么办,那么就得学会盲人中流传的“流星赶月法”,此法虽好也准确无误,但是能背下这么多口诀也是不容易的。
我偶尔得一密诀,介绍了用一公式计算任何一天的天干地支,不出一二分钟就能计算出一九00年到二一00年间任何一天的天干地支,且非常准确,比流星赶月法不知要省事多少倍。
1:1900----2100年年干=年尾数—3例:1969年年干=9—3=6,第6位天干就是已;2012年年干=2—3=9,第9位天干是壬(2不足减就补十成12)。
2:1900----1999年年支=年尾二位数+1;2000----2099年年支=年尾二位数+5。
例:1969年年支=69+1=70,去掉60的倍数为10,地支第十位为酉;2012年年支=12+5=17,去掉12余5,地支第五位是辰;那么1969年干支就是已酉2012年干支就是壬辰。
3:月干公式,月的地支是固定的如正月起寅之类,只计算月干。
月干=年干数*2+月份例:1969年(已酉)年八月(酉月)的天干=6*2+8=20,天干10为周期就去掉10,天干第十位为癸,则此月干支为癸酉。
4:日干支公式:1900----1999年日干支基数=(年尾二位数+3)*5+55+(年尾二位数—1)/4 2000----2099年日干支基数=(年尾二位数+7)*5+15+(年尾二位数+19)/4(只用商数,余数不用,数过60就去掉60)。
例:2008年月日10月18日:日干支基数=(8+7)*5+15+(8+19)/4=36(已去掉60的倍数)这数就是1月1号的干支数。
从1月1号到10月5日按满60去之后数为36+31(1月下类推)+29+31+30+31+30+31+31+30+18=7+0+1+1+1+18=28则天干去10的倍数余8为辛,地支去12的倍数余4为卯。
C语言课程设计万年历 完整版

目录一引言 (2)二系统功能和数据说明 (3)一)功能简介 (3)二)程序中的数据说明 (3)三程序总体设计及流程图 (4)一)应用到的c语言 (4)二)程序的总框架 (5)四功能模块设计及调试 (5)一)算法说明 (5)1.总天数的算法 (5)2.计算输入日期是星期几 (6)3.对输入信息的汇总 (8)4..界面的控制 (10)二)调试结果 (11)五程序清单 (12)六结束语 (17)一引言通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。
学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。
我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。
C语言是近年在国内外得到迅速推广应用的一种语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。
通过这个小小的日历可以实现很多功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
在不断的调试中最终才获得最为完整的程序。
接下来就是我的C 语言课程设计的具体内容来了二系统功能和数据说明(一)功能简介在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。
在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。
下面是它要实现的一些基本功能:用C语言编写万年历1、输入年份,判断是否为闰年2、输入年月日,判断改日为星期几3、输入年份,打出12个月历,输入月份,打出该月的日历4、要求用多个函数实现[名称]万年历[修改]1、对输入的日期进行容错处理2、增加和修改为英文的月份和星期显示3、采用指针形式的weeks和month数组(二)程序中的数据说明①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。
万年历程序实验报告

万年历程序实验报告一、实验目的与要求1.实验目的:(1)能按照软件工程的思想,采用面向过程的方法开发出一个小型软件系统。
(2).在软件系统开发过程中,能综合利用一门编程语言、和软件工程二门课程的知识。
(3).通过实例使同学们掌握结构化数据流分析技术。
2.要求:(1)软件需求分析:要求做到使用结构化数据流分析技术分析课题需求,写出详细的数据流图和数据字典,数据流图的基本处理的个数不得少与5个。
(2)软件设计与编码:要求做到对上一实验的软件需求进行软件结构设计,模块数不少于四个。
然后再进行详细设计并编码。
程序要符合结构化程序的要求。
(3)软件测试和调试:要求掌握如何设计测试方案、撰写测试说明书,并掌握程序修改的常用技术。
要求对上一实验所编的程序进行测试,要分步进行,要有详细的测试说明书,要测试通过。
二、实验方案(一)软件需求分析1.需求分析:编制一个万年历程序,程序包括的功能查询具体某年某月某日是星期几,查询某一年是否闰年,打印某一年的年历。
2.根据需求画出初步的数据流图:把“万年历系统”细化,得出完整的数据流图如下:3.根据需求分析与数据流图,写出卡片式的数据字典(2)软件设计与编码1.首先进行总体设计,根据需求,系统应该划分功能模块如下:2.进行详细设计 按照需求,本系统有上图所示的三个功能模块,所以在编码设计的时候,应该就分别设计三个功能模块,三个功能模块主要就是三个分别的算法。
先定义本程序主要的几个数据项:char*month_str[]={"January","February","March","April","May","June","July","August","September","Oc tober","November","December"}; //月份的名称,在列印年历的功能时候使用到char* week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};//星期,在查询具体某天是星期几时候使用到接着就是三个算法,因为三个算法都是借鉴别人的,所以就不在这里显示了,最后在main 函数用switch 语句把三个功能组合起来。
农历算法及十二个时辰

中国的一种历法,是阴阳历的一种,一般就叫阴历。
平年十二个月,大月三十天,小月二十九天,全年354天或355天(一年中哪一月大,哪一月小,年年不同)。
由于平均每年的天数比太阳年约差十一天,所以在十九年里设置七个闰月,有闰月的年份全年383天或384天。
又根据太阳的位置,把一个太阳年分成二十四个节气,便于农事。
纪年用天干地支搭配,六十年周而复始。
这种历法相传创始于夏代,所以又称为夏历。
也叫旧历。
在世界上中国是最早发明历法的国家之一,它的出现对中国经济,文化的发展有一定的影响。
农历,中国传统历法之一,也被称为“阴历”、“殷历”、“古历”、“黄历”、“夏历”和“旧历”等。
农历属于阴阳历并用,一方面以月球绕地球运行一周为一“月”,平均月长度等于“朔望月”,这一点与阴历原则相同,所以也叫“阴历”;另一方面设置“闰月”以使每年的平均长度尽可能接近回归年,同时设置二十四节气以反映季节的变化特征,因此农历集阴、阳两历的特点于一身,也被称为“阴阳历”。
至今几乎全世界所有华人以及朝鲜半岛和越南等国家,仍旧使用农历推算传统节日如春节、中秋节、端午节等节日。
智慧的中国人在经年的劳作中发明了历法和节气。
相传,在很久以前,有个名字叫万年的青年,有一天,他上山砍柴的时候,因为太阳晒得太热,坐在树荫下休息。
突然,地上树影的移动启发了他。
回家之后,他就用了几天几夜设计出一个测日影计天时的晷仪。
可是,当天阴有雨或有雾的时候,就会因为没有太阳,而影响了测量。
后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。
天长日久,他发现每隔三百六十多天,天时的长短就会重复一遍。
当时的国君叫祖乙,天气的不测,也使他很苦恼。
万年听说后,忍不住就带着日晷和漏壶去见国君,对祖乙讲了日月运行的道理。
祖乙听后龙颜大悦,觉得很有道理。
于是把万年留下,在天坛前修建日月阁,筑起日晷台和漏壶亭。
祖乙对万年说:「希望你能测准日月规律,推算出准确的晨夕时间,创建历法,为天下的黎民百姓造福。
年月日时干支推算法

年月日时干支推算法篇一:年月日时干支推算法年月日时干支推算法一、推算年干支口诀掌上推算年干支,支子花甲起根源。
阳支都是旬开始,天干为甲尾四年。
隔位逆推十年正,顺推年尾五零三。
逐支加减六十数,掌上推算千万年。
推算方法:“掌上推算年干支,支子花甲起根源。
”此法是将地支排列在掌中,手掌上推算年干支的方法。
首先,在掌上将地支定位(图一),然后以地支子位为花甲子的开始,可定为1864,1924,也可定为1984年???,其年都是甲子年。
“阳支都是旬开始,天干为甲尾四年。
”地支中的子,寅,辰,午,申,戌都是阳支,而且也是每旬的开始,天干都为甲,即甲子,甲戌,甲申,甲午,甲辰,甲寅,这些年的公历尾数均为四。
“隔位逆推十年正,顺推年尾五零三。
”天干十数,地支十二数,天干与地支组合天干每循环一次,地支总与下二支(旬空)。
其中余下的第一支便是下旬的开始。
我们从地支子位开始,隔一位逆推,即从子位逆推隔亥到戌,恰是甲戌旬的开始,再逆推隔一位酉至申为甲申旬开始,------年尾数都为四,年间隔都是十年。
在确定旬开始以后,以该年尾数四为起点,从下支开始挨位顺推,其公历年尾数分别是5,6,8,9,0,1,2,3,而后又是下旬的开始。
“逐支加减六十数,掌上推算千万年”掌握此法推算,如果将甲子年定为1984年,按口诀可知1994年为甲戌,20XX年为甲申,20XX年为甲午等。
确定每旬开始的公历年数后,可根据需要顺推任何一年的干支,虽意性很大,可推千年万年的干支。
二、推算月、时干支口诀天干五合前为主,月时干序一至五。
年干隔数配寅月,日干配时本数身。
古往今来,年上起月,日上起时,是按天干五合的方法,分成五种情况,即甲、己之年(日)定月(时)的方法相同------。
我们也采用这种方法,并一前一天干为主,即甲、己以甲为主,乙、庚以乙为主,------,配上序数甲为1,乙为2,丙为3,丁为4,戊为5(图二),成为推算月、时的固定序数。
“年干隔位配寅月”,推算某年的月干,先看该年干与何干相合,然后按“天干五合前为主”的方法,查出该干的序数,并设此干为零,按序数隔干确定寅月的天干。
查万年历表

查万年历表中国历法的基础是农历和天干地支纪年。
在中国历史上,还有不少其他历法的使用,例如夏历、殷历、周历和秦历等。
其中夏历和殷历虽然在历史上都有记载,但由于资料匮乏,无法重建。
周历和秦历虽然得到了正式的实施和使用,但只是短暂的历史留痕。
农历是中国古代的主流历法,即采用圆月观测的历法。
天干地支纪年是一种十分独特的纪年方式,也是中国独有的。
在中国历史上,制定历法可谓是一项重大的科学工作。
制定历法关系到天文学、历史学、数学等多个学科的深入研究。
中国历法的制定与研究,囊括了丰富的天文学、地理学、气象学知识,也体现了古代中国哲学、文化和政治制度的卓越成就。
现在我们普遍使用的万年历表,是由月历和公历组成。
公历是以地球日为基础的历法,具有高度的科学性和精度。
而月历则是用圆月观测而得出的历法。
为了方便使用,万年历表将两者相结合,形成了一种集大成者,能够方便人们查询各种岁次的日期信息。
但实际上,制定一个完整的中国历法的过程是十分繁琐的。
首先,需要确定岁首,即农历的元旦。
其次,需要确定天干地支纪年的开始年份。
接着,需要制定农历每个月的初一和月球的运行周期,以确定各个月份的大小。
最后,还需要确定公历的算法和定朔法,以确定新月和满月的时间。
这些都是需要科學家和学者不断的精心研究和探讨。
对于历法制定和研究,中国从古至今一直坚持华夏传统文化的习惯和惯例。
尽管在过去的几百年中,也曾经有过的一些历法改革的尝试,但依然没有影响到中国传统历法的性质和特点。
值得一提的是,中国历法既有科学性,又有神秘性。
而这种神秘性,源自于它所蕴含的深远文化内涵。
总的来说,中国历法在历史上的演变过程中,一直在不断的完善和发展。
尤其在农业社会里,历法的使用具备了很强的现实意义和实际需求。
而在现代社会,历法虽然已经不再是人们日常生活中的必需品,但仍然具有很高的学术价值和文化价值。
数据结构课程设计万年历查询
目录一、题目概述(内容及要求) (2)二、功能分析 (2)三、设计 (3)四、运行与测试 (11)五、总结 (15)参考文献 (16)一、题目概述(内容及要求)1. 内容:输出公元1年至9999年的日历;以标准日历的形式输出,包含月份、星期以及具体某一天对应的年、月、星期;用数据结构课上所学二叉树及队列顺序存储形式存储。
1.要求:①输入年份②选择列数③打印日历并写入文件。
说明:列数表示打印格式12行一列、6行二列、四行三列。
二、功能分析1. 当你输入正确的公元年份时,程序会弹出选择菜单,然你选择输出方式。
然后去F盘,看file文档即可。
当你输入一个错误的年份,比如-2时。
因为这个年份无法通过循环的判定,所以程序无法继续下去。
同时,时间复杂度为Q(n)。
2.确定每年的第一天是星期几。
设公元元年一日是星期一,根据蔡司公式,用365乘以(year-1)再与年多出来的一天求和,与7取余,再加一天,就能求出所求年的一月一日是星期几了。
3.确定所求年是不是闰年。
普通年能被4整除且不能被100整除的为闰年。
4. 使输出的数字对齐。
当输出数字小于10时,输出两个空格。
当输出数字大于等于10时,输出一个空格。
5.算法的改进设想。
(1)可以不以公元元年一月一日为起点,可以找出任意年的任意天作为原点。
(2)case2,case3中的计算首日的部分可以共享,这样能减少代码长度。
三、设计1. 每个程序中使用的存储结构设计说明。
本程序用到的存储结构式数组int month[13]={0,1,2,3,4,5,6,7,8,9,10,11,12} //储存一年的总月数int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} //储存每个月的天数int i=12; //月份int j=6; //每个月需要打印的行数int k=7; // 每个月需要打印的列数a[i][j][k] //储存每个月里,每个数据的位置2.每个部分的算法设计说明。
农历月上起日法
农历月上起日法一般命理书在介绍四柱推算时只讲解了年月时三柱推算法及口诀。
对于农历日干支只推荐查万年历。
目前网络上介绍的要么是阳历推算法要么是盲派的口诀记忆法。
但很不利于初学者。
现根据本人所实践的月上起日法介绍出来供大家参考:一、牢记住十二中气节气在阳历各月的大致分布日期。
特别是十二气。
采用定日法记住十二中气所在阳历月日最好。
不必精准。
正月雨水节在2月19日,二月春分在3月21日,三月谷雨在4月20日,四月小满在5月21日,五月夏至在6月22日,六月大暑在7月23日,七月处暑在8月23日,八月秋分在9月23日,九月霜降在10月23日,十月小雪在11月23日,冬月冬至在12月22日,腊月大寒在来年元月21日等。
二、采用阳历推算日干支法推算出前述各月中气日的农历。
因为除有闰月的年份外。
每个农历月都有二十四节气中的气分布。
其方法网络上多有介绍。
最好是推算出上年冬至日的农历日期日,因为每年冬至都是在十一月。
除特殊年份外不会在其他月份。
这也是古代推算二十四节气的起点日。
以冬至所在的月日为起点推算其余十一气的农历月日。
三、以十二气所在农历月日干支为基础推算出各农历月各日期的日干支。
1首先掌握每年元旦日农历日期和日干支推算法。
其农历日期推算法口诀如下:起始差值用四除,商余用法要记住商数乘以十四值,余数乘以十点六。
二个乘值再相加,除以二十九点五。
余数只看整数值,即为农历日期数。
此是各年元旦值,其余日期自然明。
以上口诀的起始年是以1900年或以1976年为基础进行推算法的。
建议2000年后采取以1976年为基础进行为好。
否则有差异。
其每年元旦日推算公式:A(推算年-1900或1976)/4=商,,,,余数。
B上年冬至农历日期={[(商数X14)+(余数X10.6)]-9}/29.5的余数.C元旦农历日期=冬至农历日期+10D十二中气农历日期:如雨水日期=(元旦日期十49)/29.5的余数不四、以上年冬至日期为基础的推算法应注意的几个问题。
基于单片机的电子万年历的设计与实现毕业论文
保密类别编号毕业论文基于单片机的电子万年历的设计与实现摘要电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行.它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能.在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。
在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现.在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在老师和同学的帮助下才完成了程序部分的编写.关键词:单片机万年历DS1302 STC89C52第1章绪论 (1)1。
1 课题研究的背景 (1)1。
2 国内外关于该论题的研究现状和发展趋势 (1)1。
3 本课题研究的目的 (1)第2章系统基本方案选择和论证 (1)2。
1 单片机芯片的选择 (1)2.2 显示模块选择方案和论证 (1)2.3 时钟芯片的选择方案和论证 (1)2。
4 温度传感器的选择方案与论证 (2)第3章系统的硬件设计与实现 (3)3.1电路设计框图 (3)3.2 主要单元电路的设计 (4)3.3 单片机中断系统 (5)3.4 温度采集模块设计 (8)3。
5显示模块的设计 (9)3.6系统的软件设计 (10)结论1。
硬件测试 (12)2.软件测试 (12)参考文献 (13)附录 (14)后记 (16)第1章绪论1.1 课题研究的背景随着微电子技术和超大规模集成电路技术的不断发展家用电子产品不但种类日益丰富而且变得更加经济实用。
农历干支查询(最好最全的万年历)
农历干支查询(最好最全的万年历)展开全文“干支历”又称星辰历、节气历、甲子历、中国阳历,主要由四部分构成,分别为干支纪年、干支纪月、干支纪日、干支纪时。
干支历是把十天干和十二地支相结合构成六十个组合,以二十四节气和十二月建为基本内容。
十天干、十二地支具体内容在之前的文章有写,这里不再赘述,感兴趣的可以去翻阅。
60个组合详见图片干支60个组合24节气如下:立春、雨水、惊蛰、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、寒露、霜降、立冬、小雪、大雪、冬至、小寒、大寒。
大家对于60组合以及24节气应该比较熟悉,那12月建是什么呢?12月建是依据24节气划分的“节气月”。
24节气中立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪、小寒分别对应寅月、卯月、辰月、巳月、午月、未月、申月、酉月、戌月、亥月、子月、丑月。
按照这种干支历法,寅月才是正月,才是新一年的开始。
注意:这里的正月和我们现在用到的农历正月算法不同。
农历以干支历为基础,但不完全等于干支历,农历中正月初一为正月的第一天,干支历中立春那天为正月的第一天,农历中的正月初一并不一定是立春。
说完这些就要说一说如何用天干地支推算年、月、日、时了。
这里所有的推算与现在所用农历时间相关,以农历正月初一为新年的开始,以立春节气为新月的开始。
干支组合排序参考上图(干支60个组合)。
干支纪年法无论年、月、日、时都是天干地支,参考上图可以得出甲子年60年出现一次,甲子月60月出现(5年)一次,甲子时60时辰(5天)出现一次的规律。
其实推算时间有很多公式,内容有些复杂,就不在这里展示了,如想了解,直接去网上查找即可。
我个人认为口诀推算更容易理解一些,所以就以口诀推算来举例。
行事历月干支(年上起月)推算口诀:甲己之年丙作首,乙庚之岁戊为头,丙辛之岁寻庚上,丁壬壬寅顺水顺,若问戊癸何处起,甲寅之上好追求。
这个口诀的意思是:遇到年份带“甲”和“己”的,该年立春的那一天是“丙寅月”的开始;遇到年份带“乙”和“庚”的,该年立春的那一天是“戊寅月”的开始;遇到年份带“丙”和“辛”的,该年立春的那一天是“庚寅月”的开始;遇到年份带“丁”和“壬”的,该年立春的那一天是“壬寅月”的开始;遇到年份带“戊”和“癸”的,该年立春的那一天是“甲寅月”的开始。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
万年历算法 程序匠人 发表于 2006-11-28 22:43:00 阅读全文(749) | 回复(1) | 引用通告(0) | 编辑 万年历算法 一、 阳历算法 具体算法见函数Void get_solar_day_date(void),这样阳历日历的星期排法就确定了。 表1:
月份 1 2 3 4 5 6 7 8 9 10 11 12 闰年 31 29 31 30 31 30 31 31 30 31 30 31 非闰年 31 28 31 30 31 30 31 31 30 31 30 31
变量定义: Public: Unsigned int temp_total_day; Unsigned char gc_solar_calendar_year; Unsigned char gc_solar_calendar_month; Unsigned char gc_solar_calendar_date; Unsigned char gc_lunar_calendar_year; Unsigned char gc_lunar_calendar_month; Unsigned char gc_lunar_calendar_date; Unsigned char start_day_of_week; 说明:函数get_solar_day_date(void)的输入变量:gc_solar_calendar_year和gc_solar_calendar_month 输出变量:start_day_of_week和temp_total_day Void get_solar_day_date(void) { unsigned char temp01; /*------calculate what day is the day of the current month and year. Mon~Sun?---*/ /*条件初始化二次,减少运算数据量. temp_total_day 是int型变量*/ start_day_of_week = 2; temp_total_day = 0;calculate_temp = 1; if(gc_solar_calendar_year > 99) {start_day_of_week = 6;calculate_temp = 100;} for(temp01 = calculate_temp; temp01{ if(temp014 == 0){start_day_of_week =2;temp_total_day = 366; } else {start_day_of_week =1;temp_total_day = 365;}} for(temp01 = 1;temp01{ switch(temp01) {case 1,3,5,7,8,10,12: start_day_of_week =3;temp_total_day =31;break; case 2: if(((gc_solar_calendar_year4) == 0)&&(gc_solar_calendar_year != 200)) {start_day_of_week =1; temp_total_day =29;} else {start_day_of_week =0;temp_total_day =28;} break; case 4,6,9,11: start_day_of_week =2; temp_total_day =30; break;}} start_day_of_week =7; /*-end of calculate what day is the day(Mon~Sun?) and total day --*/ }
二、 阴历算法 200年需要200 × 2 = 400个字节,构成阴历压缩数据表lunar_calendar_month_table[]如下: const char lunar_calendar_month_table[]={ //从阴历年1900年到2100年 /*the total day of each month pointer */ /* from 1901~2100*/ /* (0110)110000001001 (0110)leap month,110000001001 lunar month total day: 1:29 0:30*/ 0x00,0x04,0xad,0x08,0x5a,0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45, 0x95,0x0a,0xa6,0x04,0x55,0x24,0xad,0x08,0x5a,0x62,0xda,0x04,0xb4,0x05, 0xb4,0x55,0x52,0x0d,0x94,0x0a,0x4a,0x2a,0x56,0x02,0x6d,0x71,0x6d,0x01, 0xda,0x02,0xd2,0x52,0xa9,0x05,0x49,0x0d,0x2a,0x45,0x2b,0x09,0x56,0x01, 0xb5,0x20,0x6d,0x01,0x59,0x69,0xd4,0x0a,0xa8,0x05,0xa9,0x56,0xa5,0x04, 0x2b,0x09,0x9e,0x38,0xb6,0x08,0xec,0x74,0x6c,0x05,0xd4,0x0a,0xe4,0x6a, 0x52,0x05,0x95,0x0a,0x5a,0x42,0x5b,0x04,0xb6,0x04,0xb4,0x22,0x6a,0x05, 0x52,0x75,0xc9,0x0a,0x52,0x05,0x35,0x55,0x4d,0x0a,0x5a,0x02,0x5d,0x31, 0xb5,0x02,0x6a,0x8a,0x68,0x05,0xa9,0x0a,0x8a,0x6a,0x2a,0x05,0x2d,0x09, 0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25,0x75,0x95,0x0a, 0x96,0x04,0x4d,0x54,0xad,0x04,0xda,0x04,0xd4,0x44,0xb4,0x05,0x54,0x85, 0x52,0x0d,0x92,0x0a,0x56,0x6a,0x56,0x02,0x6d,0x02,0x6a,0x41,0xda,0x02, 0xb2,0xa1,0xa9,0x05,0x49,0x0d,0x0a,0x6d,0x2a,0x09,0x56,0x01,0xad,0x50, 0x6d,0x01,0xd9,0x02,0xd1,0x3a,0xa8,0x05,0x29,0x85,0xa5,0x0c,0x2a,0x09, 0x96,0x54,0xb6,0x08,0x6c,0x09,0x64,0x45,0xd4,0x0a,0xa4,0x05,0x51,0x25, 0x95,0x0a,0x2a,0x72,0x5b,0x04,0xb6,0x04,0xac,0x52,0x6a,0x05,0xd2,0x0a, 0xa2,0x4a,0x4a,0x05,0x55,0x94,0x2d,0x0a,0x5a,0x02,0x75,0x61,0xb5,0x02, 0x6a,0x03,0x61,0x45,0xa9,0x0a,0x4a,0x05,0x25,0x25,0x2d,0x09,0x9a,0x68, 0xda,0x08,0xb4,0x09,0xa8,0x59,0x54,0x03,0xa5,0x0a,0x91,0x3a,0x96,0x04, 0xad,0xb0,0xad,0x04,0xda,0x04,0xf4,0x62,0xb4,0x05,0x54,0x0b,0x44,0x5d, 0x52,0x0a,0x95,0x04,0x55,0x22,0x6d,0x02,0x5a,0x71,0xda,0x02,0xaa,0x05, 0xb2,0x55,0x49,0x0b,0x4a,0x0a,0x2d,0x39,0x36,0x01,0x6d,0x80,0x6d,0x01, 0xd9,0x02,0xe9,0x6a,0xa8,0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08, 0xb4,0x38,0x6c,0x09,0x54,0x75,0xd4,0x0a,0xa4,0x05,0x45,0x55,0x95,0x0a, 0x9a,0x04,0x55,0x44,0xb5,0x04,0x6a,0x82,0x6a,0x05,0xd2,0x0a,0x92,0x6a, 0x4a,0x05,0x55,0x0a,0x2a,0x4a,0x5a,0x02,0xb5,0x02,0xb2,0x31,0x69,0x03, 0x31,0x73,0xa9,0x0a,0x4a,0x05,0x2d,0x55,0x2d,0x09,0x5a,0x01,0xd5,0x48, 0xb4,0x09,0x68,0x89,0x54,0x0b,0xa4,0x0a,0xa5,0x6a,0x95,0x04,0xad,0x08, 0x6a,0x44,0xda,0x04,0x74,0x05,0xb0,0x25,0x54,0x03,};
确定阳历日和阴历日的对应关系的算法: 对于其他任何一个阳历日和阴历日的对应关系,都可以通过以下算法求得结果。具体算法由如下函数get_lunar_day(void)实现: 说明:函数get_lunar_day(void)的输入变量:gc_solar_calendar_year和gc_solar_calendar_month 输出变量:gc_lunar_calendar_year、gc_lunar_calendar_month和gc_lunar_calendar_date void get_lunar_day(void)/*计算出输入阳历年、阳历月,对应该阳历月第一天对应阴历时间,即阴历年、月、日*/ {unsigned char temp_leap_month; unsigned char temp_flag; unsigned char calculate_temp; unsigned char mc_tpumenus_temp_loop; unsigned char mc_tpumenus_temp_01; temp_leap_month = 0;temp_flag = 1; //条件初始化二次,减少运算数据量. if(gc_solar_calendar_year > 99) {gc_lunar_calendar_year = 99;gc_lunar_calendar_month = 11; gc_lunar_calendar_date = 25;temp_total_day = 25;calculate_temp = 100;} else {gc_lunar_calendar_year = 0;gc_lunar_calendar_month = 11; gc_lunar_calendar_date = 11;temp_total_day = 11;calculate_temp = 1;} if(gc_solar_calendar_year >calculate_temp||gc_solar_calendar_month>1) { for(mc_tpumenus_temp_loop = 1;mc_tpumenus_temp_loop>0;){ temp_total_day -=calendar_calculate_lunar_month_total_day(); temp_leap_month = tpumenus_lunar_calendar_month_table[2*gc_lunar_calendar_year 1]; temp_leap_month = (temp_leap_month>>4)&0x0F; if(gc_lunar_calendar_month == temp_leap_month) {switch(gc_lunar_calendar_year) {case 6,14,19,25,33,36,38,41,44,52,55,79,117, 136,147,150,155,158,185,193: if(temp_total_day<31){gc_lunar_calendar_date = temp_total_day; mc_tpumenus_temp_loop = 0;temp_flag = 0;} else temp_total_day -= 30; break; //current month:temp_leap_month