公历和农历转换算法详解_第1页
公历和农历转换算法详解_第2页
公历和农历转换算法详解_第3页
公历和农历转换算法详解_第4页
公历和农历转换算法详解_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、公历和农历转换算法详解/C51 写的公历转农历和星期#define uchar unsigned char#define uint unsigned int #include <intrins.h> /*公历年对应的农历数据 ,每年三字节 ,格式第一字节 BIT7-4 位表示闰月月份 , 值为 0 为无闰月 ,BIT3-0 对应农历第 1-4 月的大小 第二字节 BIT7-0 对应农历第 5-12 月大小 ,第三字节 BIT7 表示农历第 13 个月大小 月份对应的位为 1 表示本农历月大 (30 天 ),为 0 表示小 (29 天)第三字节 BIT6-5 表示春节的公历月份 ,B

2、IT4-0 表示春节的公历日期*/code uchar year_code597 = 0x04,0xAe,0x53,/1901 00x0A,0x57,0x48,/1902 30x55,0x26,0xBd,/1903 60x0d,0x26,0x50,/1904 90x0d,0x95,0x44,/1905 120x46,0xAA,0xB9,/1906 150x05,0x6A,0x4d,/1907 180x09,0xAd,0x42,/1908 210x24,0xAe,0xB6,/19090x04,0xAe,0x4A,/19100x6A,0x4d,0xBe,/19110x0A,0x4d,0x52,/1

3、9120x0d,0x25,0x46,/19130x5d,0x52,0xBA,/19140x0B,0x54,0x4e,/19150x0d,0x6A,0x43,/19160x29,0x6d,0x37,/19170x09,0x5B,0x4B,/19180x74,0x9B,0xC1,/19190x04,0x97,0x54,/19200x0A,0x4B,0x48,/19210x5B,0x25,0xBC,/19220x06,0xA5,0x50,/19230x06,0xd4,0x45,/19240x4A,0xdA,0xB8,/19250x02,0xB6,0x4d,/19260x09,0x57,0x42,/1

4、9270x24,0x97,0xB7,/19280x04,0x97,0x4A,/19290x66,0x4B,0x3e,/19300x0d,0x4A,0x51,/19310x0e,0xA5,0x46,/19320x56,0xd4,0xBA,/19330x05,0xAd,0x4e,/19340x02,0xB6,0x44,/19350x39,0x37,0x38,/19360x09,0x2e,0x4B,/19370x7C,0x96,0xBf,/19380x0C,0x95,0x53,/19390x0d,0x4A,0x48,/19400x6d,0xA5,0x3B,/19410x0B,0x55,0x4f,/1

5、9420x05,0x6A,0x45,/19430x4A,0xAd,0xB9,/19440x02,0x5d,0x4d,/19450x09,0x2d,0x42,/19460x2C,0x95,0xB6,/19470x0A,0x95,0x4A,/19480x7B,0x4A,0xBd,/19490x06,0xCA,0x51,/19500x0B,0x55,0x46,/19510x55,0x5A,0xBB,/19520x04,0xdA,0x4e,/19530x0A,0x5B,0x43,/19540x35,0x2B,0xB8,/19550x05,0x2B,0x4C,/19560x8A,0x95,0x3f,/1

6、9570x0e,0x95,0x52,/19580x06,0xAA,0x48,/19590x7A,0xd5,0x3C,/19600x0A,0xB5,0x4f,/19610x04,0xB6,0x45,/19620x4A,0x57,0x39,/19630x0A,0x57,0x4d,/19640x05,0x26,0x42,/19650x3e,0x93,0x35,/19660x0d,0x95,0x49,/19670x75,0xAA,0xBe,/19680x05,0x6A,0x51,/19690x09,0x6d,0x46,/19700x54,0xAe,0xBB,/19710x04,0xAd,0x4f,/1

7、9722/1973/1974/1975/1976/1977/1978/1979/1980/1981/1982/1983/1984/1985/1986/1987/1988/1989/1990/1991/1992/1993/1994/1995/1996/1997/1998/1999 294/2000 297/2001/2002/2003/2004/2005/2006/2007/2008/2009/2010/2011/2012/2013/2014/2015/20160x0A,0x4d,0x43, 0x4d,0x26,0xB7, 0x0d,0x25,0x4B, 0x8d,0x52,0xBf, 0x0B

8、,0x54,0x52, 0x0B,0x6A,0x47, 0x69,0x6d,0x3C, 0x09,0x5B,0x50, 0x04,0x9B,0x45, 0x4A,0x4B,0xB9, 0x0A,0x4B,0x4d, 0xAB,0x25,0xC2, 0x06,0xA5,0x54, 0x06,0xd4,0x49, 0x6A,0xdA,0x3d, 0x0A,0xB6,0x51, 0x09,0x37,0x46, 0x54,0x97,0xBB, 0x04,0x97,0x4f, 0x06,0x4B,0x44, 0x36,0xA5,0x37, 0x0e,0xA5,0x4A, 0x86,0xB2,0xBf,

9、0x05,0xAC,0x53, 0x0A,0xB6,0x47, 0x59,0x36,0xBC, 0x09,0x2e,0x50, 0x0C,0x96,0x45, 0x4d,0x4A,0xB8, 0x0d,0x4A,0x4C, 0x0d,0xA5,0x41, 0x25,0xAA,0xB6, 0x05,0x6A,0x49, 0x7A,0xAd,0xBd, 0x02,0x5d,0x52, 0x09,0x2d,0x47, 0x5C,0x95,0xBA, 0x0A,0x95,0x4e, 0x0B,0x4A,0x43, 0x4B,0x55,0x37, 0x0A,0xd5,0x4A, 0x95,0x5A,0x

10、Bf, 0x04,0xBA,0x53, 0x0A,0x5B,0x48,0x65,0x2B,0xBC,/20170x05,0x2B,0x50,/20180x0A,0x93,0x45,/20190x47,0x4A,0xB9,/20200x06,0xAA,0x4C,/20210x0A,0xd5,0x41,/20220x24,0xdA,0xB6,/20230x04,0xB6,0x4A,/20240x69,0x57,0x3d,/20250x0A,0x4e,0x51,/20260x0d,0x26,0x46,/20270x5e,0x93,0x3A,/20280x0d,0x53,0x4d,/20290x05,

11、0xAA,0x43,/20300x36,0xB5,0x37,/20310x09,0x6d,0x4B,/20320xB4,0xAe,0xBf,/20330x04,0xAd,0x53,/20340x0A,0x4d,0x48,/20350x6d,0x25,0xBC,/20360x0d,0x25,0x4f,/20370x0d,0x52,0x44,/20380x5d,0xAA,0x38,/20390x0B,0x5A,0x4C,/20400x05,0x6d,0x41,/20410x24,0xAd,0xB6,/20420x04,0x9B,0x4A,/20430x7A,0x4B,0xBe,/20440x0A,

12、0x4B,0x51,/20450x0A,0xA5,0x46,/20460x5B,0x52,0xBA,/20470x06,0xd2,0x4e,/20480x0A,0xdA,0x42,/20490x35,0x5B,0x37,/20500x09,0x37,0x4B,/20510x84,0x97,0xC1,/20520x04,0x97,0x53,/20530x06,0x4B,0x48,/20540x66,0xA5,0x3C,/20550x0e,0xA5,0x4f,/20560x06,0xB2,0x44,/20570x4A,0xB6,0x38,/20580x0A,0xAe,0x4C,/20590x09,

13、0x2e,0x42,/206050x3C,0x97,0x35,/20610x0C,0x96,0x49,/20620x7d,0x4A,0xBd,/20630x0d,0x4A,0x51,/20640x0d,0xA5,0x45,/20650x55,0xAA,0xBA,/20660x05,0x6A,0x4e,/20670x0A,0x6d,0x43,/20680x45,0x2e,0xB7,/20690x05,0x2d,0x4B,/20700x8A,0x95,0xBf,/20710x0A,0x95,0x53,/20720x0B,0x4A,0x47,/20730x6B,0x55,0x3B,/20740x0A

14、,0xd5,0x4f,/20750x05,0x5A,0x45,/20760x4A,0x5d,0x38,/20770x0A,0x5B,0x4C,/20780x05,0x2B,0x42,/20790x3A,0x93,0xB6,/20800x06,0x93,0x49,/20810x77,0x29,0xBd,/20820x06,0xAA,0x51,/20830x0A,0xd5,0x46,/20840x54,0xdA,0xBA,/20850x04,0xB6,0x4e,/20860x0A,0x57,0x43,/20870x45,0x27,0x38,/20880x0d,0x26,0x4A,/20890x8e

15、,0x93,0x3e,/20900x0d,0x52,0x52,/20910x0d,0xAA,0x47,/20920x66,0xB5,0x3B,/20930x05,0x6d,0x4f,/20940x04,0xAe,0x45,/20950x4A,0x4e,0xB9,/20960x0A,0x4d,0x4C,/20970x0d,0x15,0x41,/20980x2d,0x92,0xB5,/2099;/月份数据表code uchar day_code19=0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3;code uint day_code23=0x111,0x13

16、0,0x14e;/*函数功能 :输入 BCD 阳历数据 ,输出 BCD 阴历数据 (只允许 1901-2099 年 ) 调用函数示例 :Conversion(c_sun,year_sun,month_sun,day_sun) 如:计算 2004 年 10 月 16 日 Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun 均为 BCD 数据 ,c_sun 为世纪标志位 ,c_sun=0 为 21 世 纪 ,c_sun=1 为 19 世纪调用函数后 , 原有数据不变 , 读 c_moon,year_moon,month_moon

17、,day_moon 得出阴历 BCD 数据 */ bit c_moon;data uchar year_moon,month_moon,day_moon,week;/* 子函数 ,用于读取数据表中农历月的大月或小月,如果该月为大返回 1,为小返回 0*/bit get_moon_day(uchar month_p,uint table_addr)uchar temp;switch (month_p)case 1:temp=year_codetable_addr&0x08;if (temp=0)return(0);else return(1);case 2:temp=year_codet

18、able_addr&0x04;if (temp=0)return(0);else return(1);case 3:temp=year_codetable_addr&0x02;if (temp=0)return(0);else return(1); case 4:temp=year_codetable_addr&0x01;if (temp=0)return(0);else return(1); case 5:temp=year_codetable_addr+1&0x80;if (temp=0) return(0);else return(1);case 6:te

19、mp=year_codetable_addr+1&0x40;if (temp=0)return(0);else return(1); case 7:temp=year_codetable_addr+1&0x20;if (temp=0)return(0);else return(1); case 8:temp=year_codetable_addr+1&0x10;if (temp=0)return(0);else return(1); case 9:temp=year_codetable_addr+1&0x08;if (temp=0)return(0);else

20、return(1); case 10:temp=year_codetable_addr+1&0x04;if (temp=0)return(0);else return(1); case 11:temp=year_codetable_addr+1&0x02;if (temp=0)return(0);else return(1); case 12:temp=year_codetable_addr+1&0x01;if (temp=0)return(0);else return(1);case 13:temp=year_codetable_addr+2&0x80;if

21、(temp=0)return(0);else return(1); /*函数功能 :输入 BCD 阳历数据 ,输出 BCD 阴历数据 (只允许 1901-2099 年 ) 调用函数示例 :Conversion(c_sun,year_sun,month_sun,day_sun) 如:计算 2004 年 10 月 16 日 Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun 均为 BCD 数据 ,c_sun 为世纪标志位 ,c_sun=0 为 21 世 纪 ,c_sun=1 为 19 世纪调用函数后 , 原有数据不变 , 读 c

22、_moon,year_moon,month_moon,day_moon 得出阴历 BCD 数据 */void Conversion(bit c,uchar year,uchar month,uchar day) /c=0 为 21 世纪 ,c=1 为 19 世纪 输入输出数据均为 BCD 数据 uchar temp1,temp2,temp3,month_p;uint temp4,table_addr;bit flag2,flag_y; temp1=year/16; /BCD->hex 先把数据转换为十六进制 temp2=year%16;year=temp1*10+temp2; temp1

23、=month/16;temp2=month%16; month=temp1*10+temp2;temp1=day/16; temp2=day%16;day=temp1*10+temp2; /定位数据表地址 if(c=0) table_addr=(year+0x64-1)*0x3;else table_addr=(year-1)*0x3; /定位数据表地址完成 /取当年春节所在的公历月份 temp1=year_codetable_addr+2&0x60;temp1=_cror_(temp1,5); /取当年春节所在的公历月份完成/取当年春节所在的公历日 temp2=year_codeta

24、ble_addr+2&0x1f;/取当年春节所在的公历日完成/ 计算当年春年离当年元旦的天数 ,春节只会在公历 1月或 2 月 if(temp1=0x1) temp3=temp2-1;elsetemp3=temp2+0x1f-1;/ 计算当年春年离当年元旦的天数完成/计算公历日离当年元旦的天数 ,为了减少运算 , 用了两个表/day_code19,day_code23/如果公历月在九月或前 ,天数会少于 0xff, 用表 day_code19,/在九月后 ,天数大于 0xff, 用表 day_code23/如输入公历日为 8月 10 日,则公历日离元旦天数为 day_code18-1+

25、10-1/如输入公历日为 11月 10日,则公历日离元旦天数为 day_code211-10+10-1if (month<10)temp4=day_code1month-1+day-1;elsetemp4=day_code2month-10+day-1;if (month>0x2)&&(year%0x4=0) /如果公历月大于 2月并且该年的 2月为闰月 ,天数加 1temp4+=1;/计算公历日离当年元旦的天数完成/判断公历日在春节前还是春节后if (temp4>=temp3) / 公历日在春节后或就是春节当日使用下面代码进行运算temp4-=temp3;m

26、onth=0x1;month_p=0x1; /month_p 为月份指向 ,公历日在春节前或就是春节当日month_p 指向首月flag2=get_moon_day(month_p,table_addr);/ 检查该农历月为大小还是小月 ,大月返回 1,小月返回 0flag_y=0;if(flag2=0)temp1=0x1d; / 小月 29 天else temp1=0x1e; /大小 30 天temp2=year_codetable_addr&0xf0;temp2=_cror_(temp2,4); / 从数据表中取该年的闰月月份 ,如为 0 则该年无闰月 while(temp4>

27、;=temp1)temp4-=temp1;month_p+=1;if(month=temp2)flag_y=flag_y;if(flag_y=0)month+=1;else month+=1; flag2=get_moon_day(month_p,table_addr); if(flag2=0)temp1=0x1d;else temp1=0x1e; day=temp4+1;else / 公历日在春节前使用下面代码进行运算 temp3-=temp4;if (year=0x0) year=0x63;c=1;else year-=1; table_addr-=0x3; month=0xc;temp2

28、=year_codetable_addr&0xf0; temp2=_cror_(temp2,4);if (temp2=0)month_p=0xc;else month_p=0xd; /*month_p 为月份指向 ,如果当年有闰月 , 一年有十三个月 ,月指向 13,无闰月指向 12*/ flag_y=0;flag2=get_moon_day(month_p,table_addr); if(flag2=0)temp1=0x1d;else temp1=0x1e;while(temp3>temp1) temp3-=temp1; month_p-=1; if(flag_y=0)mont

29、h-=1; if(month=temp2)flag_y=flag_y; flag2=get_moon_day(month_p,table_addr); if(flag2=0)temp1=0x1d; else temp1=0x1e; day=temp1-temp3+1;c_moon=c; /HEX->BCD , 运算结束后 ,把数据转换为 BCD 数据 temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10; year_moon=temp1|temp2;temp1=month/10; temp1=_crol_(temp1,4);temp2=mon

30、th%10; month_moon=temp1|temp2;temp1=day/10; temp1=_crol_(temp1,4);temp2=day%10; day_moon=temp1|temp2;/*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年) 调用函数示例 :Conver_week(c_sun,year_sun,month_sun,day_sun)如:计算 2004 年 10 月 16 日 Conversion(0,0x4,0x10,0x16); c_sun,year_sun,month_sun,day_sun 均为 BCD 数据 ,c_sun 为世纪

31、标志位 ,c_sun=0 为 21 世 纪,c_sun=1为19世纪调用函数后,原有数据不变,读week得出阴历BCD数据*/code uchar table_week12=0,3,3,6,1,4,6,2,5,0,3,5; / 月修正数据表/*算法:日期+年份+所过闰年数 +月较正数之和除 7 的余数就是星期但如果是在 闰年又不到 3 月份上述之和要减一天再除 7星期数为 0*/void Conver_week(bit c,uchar year,uchar month,uchar day)/c=0为21世纪,c=1为19世纪 输入输出数据均为BCD数据uchar temp1,temp2; te

32、mp1=year/16; /BCD->hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2; temp1=month/16;temp2=month%16; month=temp1*10+temp2;temp1=day/16; temp2=day%16;day=temp1*10+temp2;if (c=0)year+=0x64;/如果为 21 世纪,年份数加 100temp1=year/0x4; /所过闰年数只算 1900 年之后的 temp2=year+temp1;temp2=temp2%0x7; /为节省资源,先进行一次取余,避免数大于0xf

33、f,避免使用整型数据 temp2=temp2+day+table_weekmonth-1;if (year%0x4=0&&month<3)temp2-=1;week=temp2%0x7;/testuchar c_sun,year_sun,month_sun,day_sun;void main()c_sun=1;year_sun=0x2;month_sun=0x11;day_sun=0x3;Conver_week(c_sun,year_sun,month_sun,day_sun);Conversion(c_sun,year_sun,month_sun,day_sun); w

34、hile(1);算法一:公历转农历/* 农历转换函数 */char *GetDayOf(PSYSTEMTIME pSt)/* 天干名称 */const char *cTianGan = " 甲","乙","丙","丁","戊 ","己","庚","辛","壬","癸"/* 地支名称 */const char *cDiZhi = " 子","丑","

35、寅 ","卯","辰","巳","午","未"," 申","酉","戌","亥"/* 属相名称 */const char *cShuXiang = " 鼠","牛","虎","兔 ","龙","蛇","马","羊","猴",&qu

36、ot;鸡","狗","猪"/* 农历日期名 */const char *cDayName = "*"," 初一","初二","初三 ","初四","初五 ", "初六","初七","初八","初九","初十","十一","十二","十三","十四 "

37、,"十五","十六 ","十","十八 "," 十九","二十","廿一 ","廿二","廿三 ","廿四","廿五","廿六","廿七","廿八","廿九","三十"/* 农历月份名 */const char *cMonName = "*"," 正

38、","二","三","四","五","六","七","八","九","十","十一 ","腊"/* 公历每月前面的天数 */const int wMonthAdd12 = 0,31,59,90,120,151,181,212,243,273,304,334;/* 农历数据 */const int wNongliData100 = 2635,333387,1701,17

39、48,267701,694,2391,133423,1175,396438 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402 ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738 ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762 ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413 ,330077,1197,2637,268877,3365,53

40、1109,2900,2922,398042,2395 ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,268949,3402,3493,133973,1386,464219,605,2349,334123,2709,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877;static int wCurY ear,wCurMonth,wCurDay;stat

41、ic int nTheDate,nIsEnd,m,k,n,i,nBit;TCHAR szNongli30, szNongliDay10,szShuXiang10;/*- 取当前公历年、月、日 -*/wCurY ear = pSt->wY ear;wCurMonth = pSt->wMonth;wCurDay = pSt->wDay;/*-计算到初始时间 1921年 2月 8日的天数: 1921-2-8(正月初一 )-*/nTheDate = (wCurY ear - 1921) * 365 + (wCurY ear - 1921) / 4 + wCurDay + wMonth

42、AddwCurMonth - 1- 38;if(!(wCurY ear % 4) && (wCurMonth > 2)nTheDate = nTheDate + 1;/*- 计算农历天干、地支、月、日 -*/ nIsEnd = 0;m = 0; while(nIsEnd != 1)if(wNongliDatam < 4095)k = 11;elsek = 12;n = k; while(n>=0)/ 获取 wNongliData(m) 的第 n 个二进制位的值 nBit = wNongliDatam;for(i=1;i<n+1;i+)nBit = nBi

43、t/2;nBit = nBit % 2;if (nTheDate <= (29 + nBit)nIsEnd = 1; break;nTheDate = nTheDate - 29 - nBit;n = n - 1; if(nIsEnd)break; m = m + 1; wCurY ear = 1921 + m; wCurMonth = k - n + 1; wCurDay = nTheDate;if (k = 12)if (wCurMonth = wNongliDatam / 65536 + 1) wCurMonth = 1 - wCurMonth;else if (wCurMonth

44、 > wNongliDatam / 65536 + 1) wCurMonth = wCurMonth - 1;/*- 生成农历天干、地支、属相=> wNongli-*/wsprintf(szShuXiang,"%s",cShuXiang(wCurY ear - 4) % 60) % 12); wsprintf(szNongli,"%s(%s%s) 年 ",szShuXiang,cTianGan(wCurY ear - 4) % 60) 10,cDiZhi(wCurY ear - 4) % 60) % 12);/*- 生成农历月、日 =>

45、 wNongliDay-*/ if (wCurMonth < 1) wsprintf(szNongliDay," 闰 %s",cMonName-1 * wCurMonth); elsestrcpy(szNongliDay,cMonNamewCurMonth);strcat(szNongliDay," 月 "); strcat(szNongliDay,cDayNamewCurDay); return strcat(szNongli,szNongliDay);首先,我们要确定一个时刻,作为一天的起点(包括这个时刻) 。然后我们以月亮通过朔望交界 点的那

46、一天作为每个月的第一天,以太阳通过雨水点的那个月作为正月,依次的,以太阳通过各中 气点的那个月作为二月、三月等等。经过长期的观察之后,我们就会发现每个月不是29天就是 30 天,每年不是 12个月就是 13 个月,每个中气点唯一对应一个月,但是有的月却没有中气。为了制定我们的历法,我们至少要知道足够精度的朔望月长度,记为 ML ,和两个中气的间隔 时间记为 YL ,这两个值经过前人长期不懈的观测和计算,我们知道分别为 29.5306 日和 30.4377 日。接下来,我们要随便找到某一年,以太阳通过雨水点的时刻到那一年开始的那个时刻的时间,记为DY,以日为单位,还要找出这一年正月里,月亮通过朔

47、望交界点的时刻到那一月开始的那个时刻的 时间,记为 DM ,以日为单位。这两个值是要通过实地观测得出来的。这个时候,我们就可以通过递推来制订我们的历法,以预测未来月球和太阳的运行情况,并进 一步预测月相的变化和气候的变化。在本算法中我们使用了三个近似处理:每天的长度总是一样的; 每个朔望月的长度总是一样的; 每两个相邻中气的时间总是一样的。接下来,我们就逐月推算每月的大小:Select Case Fix(DM + ML)Case is = 29The month have 29 days.The DM of next month is DM + ML - 29.Case is = 30The

48、month have 30 days.The DM of next month is DM + ML - 30.End Select每年中各月的月份、是否为闰月For i = 1 to 12This month has A days.If DY>=A ThenThis month is an Extra Month.DY = DY - AElseThis month is the i Month.DY = DY + YL - Ai = i + 1End IfNext这就是我们的核心算法。通过它,我们可以从任何一个包含中气的月份开始向后推算各月各年的情 况。由于我们所用的 DM、DY、ML

49、、YL 都是近似值,若干年后,我们的历法必有偏差,我们只要重新 观测,更新 DM、DY、ML、YL 的值就可以了。事实上,诸朝气数最多不过 400 年,在这些值精确 到万分位的时候,通行一朝是完全可以的。下面对大小月的排列和闰月的出现作一些定性分析显然OW DM v 1那么DM v 0.4694时,当月为小月,下月为大月DM > 0.4694时,当月为大月DMv0.4694 * 2 时,下月为小月,下下月为大月DM > 0.4694 * 2时,下月亦为大月,下下月为小月所以,大小月一般是交替出现,有时会出现连续两个月是大月的情况,但不会出现连续三个月或更 多的是大月的情况,也不会出

50、现连续两个月更多的是小月的情况。也就是说,一般是小月大月相继 出现一段时间后,接着就出现一个大月,然后又是小月大月相继出现,具体的间隔也不定,大家可 以通过计算机推算后,找点规律出来。一年中最少有十二个月,因为YL * 12 (代表十二个中气循环一次的时间)ML * 12 (代表十二个朔望月的时间) + 1 (第一个月的 DM 总小于 1),最多有十三个月,因为30(第一个月的 DY总小于 30)+ YL * 12 v ML * 14。两个相邻中气的间隔时间大于 30,所以一个月不可能有两个中气,那么一年有十二个月的时候, 12个中气必然刚好依次各居一个月,这一年就称为平年,一年有 十三个月的

51、时候,必然有且仅有一个月没有中气,那个月就时闰月,这一年就称为闰年。平年的时 候,根据大小月的排列规则,一年最多有8个大月,最少有 6个大月,因为 ML * 12 + 1 v 30 * 8 +29 *(12 - 8) ,所以不可能有 8个大月,最多为 7个大月,那么一年就为 354或 355天。闰年的时候,根据大小月的排列规则,一年最多有9 个大月,最少有 6个大月,因为 ML * 13 + 1 v 30 * 8 +29 *(13 - 8),所以不可能有 8个或更多的大月,最多为 7个大月,那么一年就为 383或 384天。因为每月的天数不固定,所以闰月的出现规律也不好讨论,连续十二个月的天数也不固定,所以闰 年的出现规律也不好讨论。不过可以肯定是,每年的第一个月肯定不是闰月,因为我们是以包含中 气雨水的月份作为正月,也就是每年的第一个月的。所以,闰月必定出现在某个有名字的月份后面, 出现在哪个后面就叫闰哪月。由于有闰月,所以函数形式:int toSolar(int ly, int lm, int ld

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论