📄 nongli.c
字号:
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 + -