在帮人写一个算命程式的时候用的一些思路,仅供参考。。 万年历中,阴阳历的转换实现方法。 阴阳历的分析。 转换过程中,是为了把一个阳历日期转换成为一个阴历日期。 具体思路是,使用一个日期做为起点(这个日期必须足够前),计算阳历日期到这个基点日期的时间差距。 再从这个基本点开始,按农历的算法,把阳历到基点日期的时间差距逐步减去。直到算出阳历对应出的农历。 阳历的算法比较容易实现, int year_day(int year,int month,int day) { int i,days=0,months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; /*每个月分别对应的日期*/ if((year%4==0)&&(year%100!=0)||(year%400==0)) months[2]=29; /*如果是闰月,2月有29天*/ for(i=1;i<month;i++) days=months+days; days=days+day; return days; } 这是一个函数,实现的功能是,计算每年的某月某日到当年一月零日的实际差距。 例如1月30日,算出的结果是30。 再加上当年到基准日期的时间差就可以算出一个阳历日期到基准日期的时间差。 阴历的算法分析: 因为阴历的算法是不固定的,没有特定的规律,但也有其规则。 基本规则是这样的,每年有大小月,大月30天,小月29天。大约每3年有一个闰年,其中有个闰月,月份不确定。如果使用数据库,将占用很多空间。现在的目的是用一个数组来实现100多年的阴历数据。 为了清晰的方便,每个数据,存放一个农历年份的数据。 因为只有大月和小月,所以可以用二进制来表示大小月份,1代表大月,0代表小月,首先假设没有闰月。 例如 1月是大月,2月是小月,3月是小月,那么用二进制实现就是 100 同样的,如果要代表总共12个月的数据,只需要一个有12位长的数据就可以了。 那么如何判断一个年份有没有闰月,是闰在几月。 刚才我们知道,要表示一年12个月份的数据,要用12位的二进制,所以用10进制表示,就是0--4095之间的数据。 现在我们只要把我们有闰月的年份的闰月的月份乘以4096,再加上去就不会出现冲突的情况。 12*4096+4095=53247 也就是说用0--53247可以表示任何一个阴历年份的任何情况。 可见用一个普通的占用2个字节的小数据就可以用来存储一年的信息。 首先把得到的数据除以 4096,得到的整数部分如果是0,那么不是闰年,如果非0,那么闰月就是哪个月份。 余数部分就是全年12个普通月份的数据。把余数分解成为2进制,依次对应各个月份是大小月就可以了。 找到了有规律的算法,就可以象阳历一样,方便的计算出到基点的时间。从而完成了,阴阳历的具体实现方法。 同样的完成了这两个部分的转换,对星期几这类更有规律的数据,就更不在话下了。 Top5 楼zhoukun666(我喜欢==〉{ 。}{ 。})回复于 2002-10-15 19:54:44 得分 0 阳历也就是公历,它是国际通用的历法。阳历是把地球绕太阳一周的时间作为一年,共365天5小时48分46秒。平年只计365天这个整数,不计尾数;一年分做12个月,大月31天,小月30天,二月只有28天。 四年的尾数积累起来共1天光景,加在第四年的二月里, 这一年叫做闰年。所以闰年的二月有29天。 阴历是把月亮圆缺一次的时间作为一个月,共29天半。为了算起来方便,规定大月30天,小月29天,一 年12个月中,大小月大体上交替排列。阴历一年只有 354天左右。 阴历不考虑地球绕太阳的运行,因此使得四季的变化 在阴历上就没有固定的时间,它不能反映季节,这是一个很大的缺点。为了克服这个缺点,后来人们定出了一种折衷的历,就是所谓的阴阳合历。 现在我们还在使用的农历就是这种阴阳合历。它跟阴历一样,也以月亮圆缺一次的时间定做一个月,也是大月30天,小月29天;可是它又用加闰月的办法,使得平均每年的天数跟阳历全年的天数相接近,来调整四季。农历每过二三年多中出一个闰月。 详细转换软件参见: http://www.csdn.net/cnshare/soft/7/7386.shtm Top6 楼zhoukun666(我喜欢==〉{ 。}{ 。})回复于 2002-10-15 19:55:45 得分 0 /* prototype: int CalConv( struct ConvDate * ); struct ConvDate { int Source; ==0 则输入日期为西历, !=0 则输入为农历 int SolarYear; 输出或输入之西历年份 int SolarMonth; 西历月 int SolarDate; 西历日 int LunarYear; 输出或输入之农历年份 int LunarMonth; 农历月 int LunarDate; 农历日 int Weekday; 该日为星期几 ( 0==星期日, 1==星期一, ... ) int Kan; 该日天干 ( 0==甲, 1==乙, ..., 9==癸 ) int Chih; 该日地支 ( 0==子, 1==丑, ..., 11==亥 ) }; 呼叫时须设定 Souce 的值, 若为 0 则为西历转农历, 否则为农历转西历. 然後视 输入为西历或农历来设定西历或农历的年月日. 转换後的年月日会填入结构中( 农 历或西历 ), 以及该日为星期几, 天干地支. 若函式的返回值为 0 表示没有错误, 1 为输入之年份错误, 2 为输入之月份错误, 3 为输入之日期错误. 输入之西历年须在 1937 - 2031 间 输入之农历年须在 1936 - 2030 间 若须扩充, 则增加 LunarCal[] */ #define FIRSTYEAR 1936 /* The first year in LunarCal[] */ struct ConvDate { int Source; int SolarYear; int SolarMonth; int SolarDate; int LunarYear; int LunarMonth; int LunarDate; int Weekday; int Kan; int Chih; }; struct tagLunarCal { int BaseDays; /* 到西历 1 月 1 日到农历正月初一的累积日数 */ int Intercalation; /* 闰月月份. 0==此年没有闰月 */ int BaseWeekday; /* 此年西历 1 月 1 日为星期几再减 1 */ int BaseKanChih; /* 此年西历 1 月 1 日之干支序号减 1 */ int MonthDays[13]; /* 此农历年每月之大小, 0==小月(29日), 1==大月(30日) */ }; struct tagLunarCal LunarCal[] = { { 23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, /* 1936 */ { 41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 }, { 30, 7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 }, { 49, 0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, { 38, 0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, /* 1940 */ { 26, 6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 }, { 45, 0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 35, 0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 }, { 24, 4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 1944 */ { 43, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 }, { 32, 0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 }, { 21, 2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, { 40, 0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, /* 1948 */ { 28, 7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, { 47, 0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, { 36, 0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 26, 5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 }, /* 1952 */ { 44, 0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1 }, { 33, 0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 }, { 23, 3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 }, { 42, 0, 6, 2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 }, /* 1956 */ { 30, 8, 1, 8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 }, { 48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 }, { 38, 0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, { 27, 6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, /* 1960 */ { 45, 0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 }, { 35, 0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 }, { 24, 4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 }, { 43, 0, 2, 44, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 }, /* 1964 */ { 32, 0, 4, 50, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 }, { 20, 3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 }, { 39, 0, 6, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0 }, { 29, 7, 0, 5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, /* 1968 */ { 47, 0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 }, { 36, 0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 }, { 26, 5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1 }, { 45, 0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 1972 */ { 33, 0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1 }, { 22, 4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 }, { 41, 0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 }, { 30, 8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, /* 1976 */ { 48, 0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 }, { 37, 0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 }, { 27, 6, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 }, { 46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0 }, /* 1980 */ { 35, 0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, { 24, 4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 }, { 43, 0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 }, { 32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 }, /* 1984 */ { 50, 0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 }, { 39, 0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1 }, { 28, 6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0 }, { 47, 0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 }, /* 1988 */ { 36, 0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, { 26, 5, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1 }, { 45, 0, 1, 6, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0 }, { 34, 0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0 }, /* 1992 */ { 22, 3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 }, { 40, 0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 }, { 30, 8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1 }, { 49, 0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1 }, /* 1996 */ { 37, 0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 }, { 27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 }, { 46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 }, { 35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 }, /* 2000 */ { 23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, { 42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, { 31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 }, { 21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, /* 2004 */ { 39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 }, { 28, 7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 }, { 48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 }, { 37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 2008 */ { 25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, { 44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, { 33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, { 22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, /* 2012 */ { 40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 }, { 49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 }, { 38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 }, /* 2016 */ { 27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 }, { 46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 }, { 35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 }, { 24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, /* 2020 */ { 42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, { 31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, { 21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 }, { 40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 }, /* 2024 */ { 28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 }, { 47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 }, { 36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 }, { 25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 }, /* 2028 */ { 43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, { 32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 } }; |