int date8_add(char *date8,char ymd,int value,char *date8added);
int checkdate8(char *date8);
long int days_from_8zeros(char *date8);
int get_data8_from_days(long int days,char *date8);
//功能:計算某年月日前後一定年數(或月數、天數)的年月日
//輸入:
// 1. date8 計算基准日期
// 2. ymd 表示下一變量的單位 'y'-年 'm'-月 'd'-日
// 3. value 偏移量:年數、月數、天數
//輸出:
// 1. date8added 計算後結果
//返回:
// 0 成功
// -1 date8非法
// -2 ymd非法
// -3 value非法
// -4 轉換後date8added的年份小於公元1年
// -5 轉換後date8added的年份大於公元9999年
// -6 轉換後date8added非法,例如得到結果為2002/02/30
int date8_add(char *date8,char ymd,int value,char *date8added)
{
char strtmp[10];
long int days;
int c,vyear,vmonth,vday;
int errbz;
// 檢查參數date8的合法性
errbz=checkdate8(date8);
if (errbz!=0) return(-1);
// 檢查參數ymd的合法性
if ( ymd!='y' && ymd!='m' && ymd!='d') return(-2);
// 檢查參數value的合法性(簡單檢查)
//if ( value < -9999 value > 9999 ) return(-3);
// 當增加量為年數時,計算結果並返回
if (ymd=='y')
{
memset(strtmp,0,sizeof(strtmp));
memcpy(strtmp,date8+0,4);
sscanf(strtmp,"%d",&vyear);
vyear+=value;
if ( vyear<1 ) return(-4); //小於公元1年
if ( vyear>9999 ) return(-5); //大於公元9999年
strcpy(date8added,date8);
sprintf(strtmp,"%04d",vyear);
memcpy(date8added,strtmp,4);
errbz=checkdate8(date8added);
if (errbz!=0) return(-6); //計算所得結果非法
return(0);
}
// 當增加量為月數時,計算結果並返回
if (ymd=='m')
{
vyear=0;
vmonth=0;
vday=0;
memset(strtmp,0,sizeof(strtmp)); memcpy(strtmp,date8+0,4); sscanf(strtmp,"%d",&vyear);
memset(strtmp,0,sizeof(strtmp)); memcpy(strtmp,date8+4,2); sscanf(strtmp,"%d",&vmonth);
memset(strtmp,0,sizeof(strtmp)); memcpy(strtmp,date8+6,2); sscanf(strtmp,"%d",&vday);
vmonth=vyear*12+vmonth+value;
vmonth--;
vyear=vmonth/12;
vmonth=vmonth%12;
vmonth++;
if (vyear<1) return(-4);
if (vyear>9999) return(-5);
sprintf(date8added,"%04d%02d%02d",vyear,vmonth,vday);
errbz=checkdate8(date8added);
if (errbz!=0) return(-6);
return(0);
}
// 當增加量為天數時,計算結果並返回
if (ymd=='d')
{
days=days_from_8zeros(date8);
days+=value;
if (days<=366) return(-4); //年號為0000
if (days>3652425) return(-5); //年號超出9999
errbz=get_data8_from_days(days,date8added);
if (errbz!=0) return(-1);
return(0);
}
}
//檢查日期YyyyMmdd
//輸入:date8 日期字符串
//返回:0-正確 -1-錯誤
int checkdate8(char *date8)
{
int c;
int errdate=0;
char str_year[5]="";
char str_mon[3]="";
char str_day[3]="";
int int_year,int_mon,int_day;
int leap_year; // 1-閏年 0-不是閏年
errdate=0;
if ( strlen(date8) != 8 ) errdate=1;
if (errdate!=1)
{
for (c=0;c<10;c++)
{
if (date8[c]==' ') errdate=1;
}
if ( date8[0] < '0' date8[0] > '9' ) errdate=1;
if ( date8[1] < '0' date8[1] > '9' ) errdate=1;
if ( date8[2] < '0' date8[2] > '9' ) errdate=1;
if ( date8[3] < '0' date8[3] > '9' ) errdate=1;
if ( date8[4] < '0' date8[4] > '9' ) errdate=1;
if ( date8[5] < '0' date8[5] > '9' ) errdate=1;
if ( date8[6] < '0' date8[6] > '9' ) errdate=1;
if ( date8[7] < '0' date8[7] > '9' ) errdate=1;
}
if (errdate!=1)
{
str_year[0]=date8[0]; str_year[1]=date8[1];
str_year[2]=date8[2]; str_year[3]=date8[3];
str_year[4]='
if ( date8[4] < '0' date8[4] > '9' ) errdate=1;
if ( date8[5] < '0' date8[5] > '9' ) errdate=1;
if ( date8[6] < '0' date8[6] > '9' ) errdate=1;
if ( date8[7] < '0' date8[7] > '9' ) errdate=1;
}
if (errdate!=1)
{
str_year[0]=date8[0]; str_year[1]=date8[1];
str_year[2]=date8[2]; str_year[3]=date8[3];
str_year[4]='