⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nongli.c

📁 万年历
💻 C
📖 第 1 页 / 共 2 页
字号:
			else 								return(1);
		case 5:
			if((year_code[table_addr+1]&0x80)==0)	return(0);
			else 									return(1);
		case 6:
			if((year_code[table_addr+1]&0x40)==0)	return(0);
			else 									return(1);
		case 7:
			if((year_code[table_addr+1]&0x20)==0)	return(0);
			else 									return(1);
		case 8:
			if((year_code[table_addr+1]&0x10)==0)	return(0);
			else 									return(1);
		case 9:
			if((year_code[table_addr+1]&0x08)==0)	return(0);
			else 									return(1);
		case 10:
			if((year_code[table_addr+1]&0x04)==0)	return(0);
			else 									return(1);
		case 11:
			if((year_code[table_addr+1]&0x02)==0)	return(0);
			else 									return(1);
		case 12:
			if((year_code[table_addr+1]&0x01)==0)	return(0);
			else 									return(1);
		case 13:
			if((year_code[table_addr+2]&0x80)==0)	return(0);
			else 									return(1);
	}
	return(0);
}

/*********************************************************************************************************
** 函数名称:GetChinaCalendar
** 功能描述:公农历转换(只允许1901-2099年)
** 输 入:  year        公历年
**          month       公历月
**          day         公历日
**          p           储存农历日期地址
** 输 出:  1           成功
**          0           失败
** 作 者:  Campo
** 修  改:  赖皮
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char GetChinaCalendar(
								unsigned int  year,	
								unsigned char month,
								unsigned char day,
								unsigned char *p)
{ 
	unsigned char temp1,temp2,temp3,month_p,yearH,yearL;	
	unsigned char flag_y;
	unsigned short temp4,table_addr;

	yearH=year/100;	yearL=year%100;
	if((yearH!=19)&&(yearH!=20))	return(0);
	
	/* 定位数据表地址 */
	if(yearH==20)	table_addr=(yearL+100-1)*3;
	else  			table_addr=(yearL-1)*3;

	/* 取当年春节所在的公历月份 */
	temp1=year_code[table_addr+2]&0x60;	
	temp1>>=5;

	/* 取当年春节所在的公历日 */
	temp2=year_code[table_addr+2]&31; 

	/* 计算当年春年离当年元旦的天数,春节只会在公历1月或2月 */
	if(temp1==1) 	temp3=temp2-1; 
	else 			temp3=temp2+31-1; 

	/* 计算公历日离当年元旦的天数 */
	if (month<10) 	temp4=day_code1[month-1]+day-1;
	else  			temp4=day_code2[month-10]+day-1;
	/* 如果公历月大于2月并且该年的2月为闰月,天数加1 */
	if ((month>2)&&(yearL%4==0)) 	temp4++;

	/* 判断公历日在春节前还是春节后 */
	if (temp4>=temp3)
	{ 						
		temp4-=temp3;
		month=1;
		month_p=1;
							
		flag_y=0;
		if(GetMoonDay(month_p,table_addr)==0)	temp1=29; //小月29天
		else 									temp1=30; //大小30天
		/* 从数据表中取该年的闰月月份,如为0则该年无闰月 */
		temp2=year_code[table_addr]/16; 	
		while(temp4>=temp1)
		{
			temp4-=temp1;
			month_p++;
			if(month==temp2)
			{
				flag_y=~flag_y;
				if(flag_y==0)month++;
			}
			else month++;
			if(GetMoonDay(month_p,table_addr)==0)	temp1=29;
			else 									temp1=30;
		}
		day=temp4+1;
	}
	/* 公历日在春节前使用下面代码进行运算 */
	else
	{ 						
		temp3-=temp4;
		if (yearL==0)
		{
			yearL=100-1;
			yearH=19;
		}
		else yearL--;
		table_addr-=3;
		month=12;
		temp2=year_code[table_addr]/16; 	
		if (temp2==0)	month_p=12; 
		else 			month_p=13; 

		flag_y=0;
		if(GetMoonDay(month_p,table_addr)==0)	temp1=29; 
		else 									temp1=30; 
		while(temp3>temp1)
		{
			temp3-=temp1;
			month_p--;
			if(flag_y==0)		month--;
			if(month==temp2)	flag_y=~flag_y;
			if(GetMoonDay(month_p,table_addr)==0)	temp1=29;
			else 									temp1=30;
		}
		day=temp1-temp3+1;
	}

	*p++=yearH;
	*p++=yearL;
	*p++=month;
	*p=day;	
	return(1);
}

static unsigned char const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
/*********************************************************************************************************
** 函数名称:GetWeek
** 功能描述:输入公历日期得到星期(只允许1901-2099年)
** 输 入:  year        公历年
**          month       公历月
**          day	        公历日
**          p           储存星期地址
** 输 出:  无
** 作 者:  Campo
** 修  改:  赖皮
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetWeek(
			unsigned int year,
			unsigned char month,
			unsigned char day,
			unsigned char *p)
{	
	unsigned int temp2;
	unsigned char yearH,yearL;
	
	yearH=year/100;	yearL=year%100;
	
	/* 如果为21世纪,年份数加100 */
	if (yearH>19)	 	yearL+=100;
	/* 所过闰年数只算1900年之后的 */
	temp2=yearL+yearL/4;
	temp2=temp2%7; 
	temp2=temp2+day+table_week[month-1];
	if (yearL%4==0&&month<3)	temp2--;
	*p=(temp2%7);
}

/*********************************************************************************************************
** 函数名称:GetSkyEarth
** 功能描述:输入公历日期得到一个甲子年(只允许1901-2099年)
** 输 入:  year        公历年
**          p           储存星期地址
** 输 出:  无
** 作 者:  赖皮
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static void GetSkyEarth(unsigned int year,unsigned char *p)
{
	unsigned char x;
	
	if(year>=1984)
	{
		year=year-1984;
		x=year%60;				
	}
	else
	{
		year=1984-year;
		x=60-year%60;
	}
	*p=x;
}
static unsigned char const sky[][3]=  {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸",};
static unsigned char const earth[][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥",};
static unsigned char const monthcode[][3]={"一","二","三","四","五","六","七","八","九","十","冬","腊",};
static unsigned char const nongliday[][3]={"初","十","廿","三",};
static void StrCopy(char *target,unsigned char *source,unsigned char no)
{
	unsigned int i;
	
	for(i=0;i<no;i++)
	{
		*target++=*source++;
	}
}
/*********************************************************************************************************
** 函数名称:GetChinaCalendarStr
** 功能描述:输入公历日期得到农历字符串	
**          如:GetChinaCalendarStr(2007,02,06,str) 返回str="丙戌年腊月十九"
** 输 入:  year        公历年
**          month       公历月
**          day         公历日
**          str         储存农历日期字符串地址   15Byte
** 输 出:  无
** 作 者:  赖皮        ★〓个人原创〓★
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetChinaCalendarStr(
								unsigned int  year,	
								unsigned char month,
								unsigned char day,
								         char *str)
{
	unsigned char NLyear[4];
	unsigned char SEyear;
	
	StrCopy(&str[0],(unsigned char *)"甲子年正月初一",15);
	if(GetChinaCalendar(year,month,day,(unsigned char *)NLyear)==0)	return;
	GetSkyEarth(NLyear[0]*100+NLyear[1],&SEyear);
	StrCopy(&str[0],(unsigned char *)  sky[SEyear%10],2);	//  甲
	StrCopy(&str[2],(unsigned char *)earth[SEyear%12],2);	//  子	
	
	if(NLyear[2]==1)	StrCopy(&str[6],(unsigned char *)"正",2);
	else				StrCopy(&str[6],(unsigned char *)monthcode[NLyear[2]-1],2);		
	
	if(NLyear[3]>10) 	StrCopy(&str[10],(unsigned char *)nongliday[NLyear[3]/10],2);	
	else				StrCopy(&str[10],(unsigned char *)"初",2);
	StrCopy(&str[12],(unsigned char *)monthcode[(NLyear[3]-1)%10],2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -