shell - 如何用date获得前一天的日期
				
				
					
					如何用date获得前一天的日期
2004-04-23 15:18 pm来自:Linux文档
现载:Www.8s8s.coM
地址:无名
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]='