免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: nkliyong
打印 上一主题 下一主题

如何用date获得前一天的日期,忘了  关闭 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2002-06-21 11:27 |只看该作者

如何用date获得前一天的日期,忘了

时区转换实在是太精妙了!:-)

论坛徽章:
0
12 [报告]
发表于 2002-06-24 15:42 |只看该作者

如何用date获得前一天的日期,忘了

在sco unix版下有本人的贴子可完美的解决楼主的问题

论坛徽章:
0
13 [报告]
发表于 2002-07-17 12:05 |只看该作者

如何用date获得前一天的日期,忘了

如果在shell中改了时区,执行完后,系统真正的时区还是正确的吗?

论坛徽章:
0
14 [报告]
发表于 2002-07-17 12:33 |只看该作者

如何用date获得前一天的日期,忘了

回楼上:最好你要把TZ的设置该回去了。
不过我在实践中用的方法是:
如果你的主机能够连接到数据库的话,比如可以连接到SYBASE数据库,那就可以利用数据库里面计算时间的丰富的函数了,比如
dateadd(day,getdate(),-1)
就能得到最天的日期了

论坛徽章:
0
15 [报告]
发表于 2002-10-11 11:30 |只看该作者

如何用date获得前一天的日期,忘了

因为这个贴子被版主盖过章,所以在此跟一下。
最近经常看到有网友关于相对日期问题的贴子,这在shell下进行解决时比较头疼。现将我作的几个程序贴出来与大家分享。虽然是用c写的,把它们贴在这里,我想大家也不会太反对的。其中一个程序以前发表在sco版下,现在早已淹没在汪洋大海中了,无从查找。
因为是早先刚学c时的作品,且英文又不行,故写出的程序比较难看,请大家别见笑。
相关链接:
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=11&topic=457&show=0
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=11&topic=91&show=30

论坛徽章:
0
16 [报告]
发表于 2002-10-11 11:31 |只看该作者

如何用date获得前一天的日期,忘了

int  date8_add(char *date8,char ymd,int value,char *date8added)&#59;
int  checkdate8(char *date&#59;
long int days_from_8zeros(char *date&#59;
int  get_data8_from_days(long int days,char *date&#59;


//功能:计算某年月日前后一定年数(或月数、天数)的年月日
//输入:
//     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]&#59;
    long int days&#59;
    int c,vyear,vmonth,vday&#59;
    int errbz&#59;

    // 检查参数date8的合法性
    errbz=checkdate8(date&#59;
    if (errbz!=0) return(-1)&#59;

    // 检查参数ymd的合法性
    if ( ymd!='y' && ymd!='m' && ymd!='d') return(-2)&#59;

    // 检查参数value的合法性(简单检查)
    //if ( value < -9999 || value > 9999 ) return(-3)&#59;

    // 当增加量为年数时,计算结果并返回
    if (ymd=='y')
    {
       memset(strtmp,0,sizeof(strtmp))&#59;
       memcpy(strtmp,date8+0,4)&#59;
       sscanf(strtmp,&quot;%d&quot;,&amp;vyear)&#59;
       vyear+=value&#59;
       if ( vyear<1 )    return(-4)&#59; //小于公元1年
       if ( vyear>9999 ) return(-5)&#59; //大于公元9999年

       strcpy(date8added,date&#59;
       sprintf(strtmp,&quot;%04d&quot;,vyear)&#59;
       memcpy(date8added,strtmp,4)&#59;
       errbz=checkdate8(date8added)&#59;
       if (errbz!=0)     return(-6)&#59; //计算所得结果非法
       return(0)&#59;
    }

    // 当增加量为月数时,计算结果并返回
    if (ymd=='m')
    {
       vyear=0&#59;
       vmonth=0&#59;
       vday=0&#59;
      
       memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+0,4)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vyear)&#59;
       memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+4,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vmonth)&#59;
       memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+6,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vday)&#59;

       vmonth=vyear*12+vmonth+value&#59;
       vmonth--&#59;
       vyear=vmonth/12&#59;
       vmonth=vmonth%12&#59;
       vmonth++&#59;

       if (vyear<1) return(-4)&#59;
       if (vyear>9999) return(-5)&#59;
       sprintf(date8added,&quot;%04d%02d%02d&quot;,vyear,vmonth,vday)&#59;
       errbz=checkdate8(date8added)&#59;
       if (errbz!=0) return(-6)&#59;
       return(0)&#59;
    }

    // 当增加量为天数时,计算结果并返回
    if (ymd=='d')
    {
       days=days_from_8zeros(date&#59;
       days+=value&#59;
       if (days<=366) return(-4)&#59;    //年号为0000
       if (days>3652425) return(-5)&#59; //年号超出9999
       errbz=get_data8_from_days(days,date8added)&#59;
       if (errbz!=0) return(-1)&#59;
       return(0)&#59;
    }

}


//检查日期YyyyMmdd
//输入:date8 日期字符串
//返回:0-正确  -1-错误
int  checkdate8(char *date
{
    int c&#59;
    int errdate=0&#59;
    char str_year[5]=&quot;&quot;&#59;
    char str_mon[3]=&quot;&quot;&#59;
    char str_day[3]=&quot;&quot;&#59;
    int int_year,int_mon,int_day&#59;
    int leap_year&#59;          // 1-闰年  0-不是闰年

    errdate=0&#59;
    if ( strlen(date != 8 ) errdate=1&#59;
    if (errdate!=1)
    {
       for (c=0&#59;c<10&#59;c++)
       {
         if (date8[c]==' ') errdate=1&#59;
       }
       if ( date8[0] < '0'  || date8[0] >  '9' ) errdate=1&#59;
       if ( date8[1] < '0'  || date8[1] >  '9' ) errdate=1&#59;
       if ( date8[2] < '0'  || date8[2] >  '9' ) errdate=1&#59;
       if ( date8[3] < '0'  || date8[3] >  '9' ) errdate=1&#59;
       if ( date8[4] < '0'  || date8[4] >  '9' ) errdate=1&#59;
       if ( date8[5] < '0'  || date8[5] >  '9' ) errdate=1&#59;
       if ( date8[6] < '0'  || date8[6] >  '9' ) errdate=1&#59;
       if ( date8[7] < '0'  || date8[7] >  '9' ) errdate=1&#59;
    }

    if (errdate!=1)
    {
       str_year[0]=date8[0]&#59; str_year[1]=date8[1]&#59;
          str_year[2]=date8[2]&#59; str_year[3]=date8[3]&#59;
          str_year[4]='\0'&#59;
       str_mon[0]=date8[4]&#59; str_mon[1]=date8[5]&#59; str_mon[2]='\0'&#59;
       str_day[0]=date8[6]&#59; str_day[1]=date8[7]&#59; str_day[2]='\0'&#59;
       int_year=atoi(str_year)&#59;
       int_mon=atoi(str_mon)&#59;
       int_day=atoi(str_day)&#59;

       if ( ((int_year%4)==0 &amp;&amp; (int_year%100)!=0) || (int_year%400)==0 )
             leap_year=1&#59;
       else  leap_year=0&#59;

       if ( leap_year==0 &amp;&amp; int_mon==2 &amp;&amp; int_day>28 ) errdate=1&#59;
       if ( leap_year==1 &amp;&amp; int_mon==2 &amp;&amp; int_day>29 ) errdate=1&#59;
       if ( int_mon==1 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==3 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==5 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==7 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==8 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==10 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==12 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==4 &amp;&amp; int_day>30 ) errdate=1&#59;
       if ( int_mon==6 &amp;&amp; int_day>30 ) errdate=1&#59;
       if ( int_mon==9 &amp;&amp; int_day>30 ) errdate=1&#59;
       if ( int_mon==11 &amp;&amp; int_day>30 ) errdate=1&#59;
    }

    if ( int_mon<1 || int_mon>12 ) errdate=1&#59;
    if ( int_day<1 ) errdate=1&#59;

    if (errdate==0) return(0)&#59;
    return(-1)&#59;

}


//功能:计算日期YyyyMmDd距离虚拟的公元00000000的天数
//输入:date8
//返回:所求天数
long int days_from_8zeros(char *date
{
   int  leap&#59;       //0-平年 1-闰年
   long int days&#59;
   int  vyear,vmonth,vday&#59;
   int  c&#59;
   char strtmp[10]&#59;

   vyear=vmonth=vday=0&#59;
   memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+0,4)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vyear)&#59;
   memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+4,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vmonth)&#59;
   memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+6,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vday)&#59;


   days=0&#59;
   for (c=0&#59;c<vyear&#59;c++)
   {
       leap=0&#59;
       if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;
       if (leap==0) days+=365&#59;
       if (leap==1) days+=366&#59;
   }

   c=vyear&#59;
   leap=0&#59;
   if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;

   for (c=1&#59;c<vmonth&#59;c++)
   {
      if (c==1) days+=31&#59;
      if (c==2 &amp;&amp; leap==0) days+=28&#59;
      if (c==2 &amp;&amp; leap==1) days+=29&#59;
      if (c==3) days+=31&#59;
      if (c==4) days+=30&#59;
      if (c==5) days+=31&#59;
      if (c==6) days+=30&#59;
      if (c==7) days+=31&#59;
      if (c== days+=31&#59;
      if (c==9) days+=30&#59;
      if (c==10) days+=31&#59;
      if (c==11) days+=30&#59;
      if (c==12) days+=31&#59;
   }

   days+=vday&#59;
   return(days)&#59;

}


//功能:根据到虚拟的公元00000000的天数计算日期
//输入:days
//输出:date8
//返回:0 成功   -1 失败
int  get_data8_from_days(long int days,char *date8)
{
    long int daystmp&#59;
    int  leap&#59; // 0-平年 1-闰年
    int  c&#59;
    int  vyear,vmonth,vday&#59;

    if (days<=0) return(-1)&#59;
    daystmp=0&#59;
    for (c=0&#59;c<=9999&#59;c++)
    {
       leap=0&#59;
       if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;
       if (leap==0) daystmp+=365&#59;
       if (leap==1) daystmp+=366&#59;
       if (c==9999 &amp;&amp; days>daystmp) return(-1)&#59;
       if (days<=daystmp)
       {
          vyear=c&#59;
          if (leap==0) daystmp-=365&#59;
          if (leap==1) daystmp-=366&#59;
          break&#59;
       }
    }

    c=vyear&#59;
    leap=0&#59;
    if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;
    for (c=1&#59;c<=12&#59;c++)
    {
        // 以下这段程序借用vday
        if (c==1) vday=31&#59;
        if (c==2 &amp;&amp; leap==0) vday=28&#59;
        if (c==2 &amp;&amp; leap==1) vday=29&#59;
        if (c==3) vday=31&#59;
        if (c==4) vday=30&#59;
        if (c==5) vday=31&#59;
        if (c==6) vday=30&#59;
        if (c==7) vday=31&#59;
        if (c==8) vday=31&#59;
        if (c==9) vday=30&#59;
        if (c==10) vday=31&#59;
        if (c==11) vday=30&#59;
        if (c==12) vday=31&#59;

        daystmp+=vday&#59;
        if (days<=daystmp)
        {
           vmonth=c&#59;
           daystmp-=vday&#59;
           break&#59;
        }
    }

    vday=days-daystmp&#59;

    sprintf(date8,&quot;%04d%02d%02d&quot;,vyear,vmonth,vday)&#59;
    return(0)&#59;

}




//功能:返回指定的年月日
//输入:
//     1. YyyyMmDd y [-+]val 返回YyyyMmDd前/后val年对应日的年月日
//     2. YyyyMmDd m [-+]val 返回YyyyMmDd前/后val月对应日的年月日
//     3. YyyyMmDd d [-+]val 返回YyyyMmDd前/后val日对应日的年月日
main(int argc,char *argv[])
{
    char date8[9]&#59;
    char ymd[2]&#59;
    long int val&#59;
    char date8added[9]&#59;

    char strtmp[10]&#59;
    int c&#59;
    int errbz&#59;

    //printf(&quot;%d\n&quot;,days_from_8zeros(&quot;00000131&quot)&#59;
    //printf(&quot;%d\n&quot;,days_from_8zeros(&quot;00010131&quot)&#59;
    //printf(&quot;%d\n&quot;,days_from_8zeros(&quot;00020401&quot)&#59;
    //printf(&quot;%d\n&quot;,days_from_8zeros(&quot;20020510&quot)&#59;
    //printf(&quot;%d\n&quot;,days_from_8zeros(&quot;20020531&quot)&#59;
    //printf(&quot;%d\n&quot;,days_from_8zeros(&quot;99991231&quot)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(31,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(397,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(822,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(731346,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(731367,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(3652425,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;
    //printf(&quot;ret:%4d &quot;,get_data8_from_days(3652426,strtmp))&#59;printf(&quot;%s\n&quot;,strtmp)&#59;

    errbz=0&#59;

    //初步检查输入合法性
    if(errbz==0 &amp;&amp; argc!=4) errbz=-999&#59;          //参数数量错误
    if(errbz==0 &amp;&amp; strlen(argv[1])!=8) errbz=-1&#59; //参数YyyyMmDd非法--长度错
    if(errbz==0 &amp;&amp; strlen(argv[2])!=1) errbz=-2&#59; //参数ymd非法--长度错

    //将参数赋值到变量
    if (errbz==0)
    {
       memset(date8,0,sizeof(date8))&#59;
       memset(ymd,0,sizeof(ymd))&#59;
       val=0&#59;
       strncpy(date8,argv[1],8)&#59;
       strncpy(ymd,argv[2],1)&#59;
       sscanf(argv[3],&quot;%d&quot;,&amp;val)&#59;
    }

    //调用函数计算新的日期值
    if (errbz==0)
    {
       memset(date8added,0,sizeof(date8added))&#59;
       errbz=date8_add(date8,ymd[0],val,date8added)&#59;
    }

    // 将结算结果或错误信息用printf输出
    if (errbz==0) printf(&quot;%s\n&quot;,date8added)&#59;

    if (errbz==-999) printf(&quot;%d Usage: date8add YyyyMmDd {ymd} [+|-]value\n&quot;,errbz)&#59;
    if (errbz==-1) printf(&quot;%d Usage: date8add YyyyMmDd {ymd} [+|-]value\n&quot;,errbz)&#59;
    if (errbz==-2) printf(&quot;%d Usage: date8add YyyyMmDd {ymd} [+|-]value\n&quot;,errbz)&#59;
    if (errbz==-3) printf(&quot;%d Usage: date8add YyyyMmDd {ymd} [+|-]value\n&quot;,errbz)&#59;
    if (errbz==-4) printf(&quot;%d result is valid\n&quot;,errbz)&#59;
    if (errbz==-5) printf(&quot;%d result is valid\n&quot;,errbz)&#59;
    if (errbz==-6) printf(&quot;%d result is valid\n&quot;,errbz)&#59;
}

论坛徽章:
0
17 [报告]
发表于 2002-10-11 11:31 |只看该作者

如何用date获得前一天的日期,忘了

#include <time.h>

//功能:返回指定的年月日
//输入:
//     1. YyyyMmDd [-+]val 返回YyyyMmDd前/后val年对应日的年月日
//     2. YyyyMmDd [-+]val 返回YyyyMmDd前/后val月对应日的年月日
//     3. YyyyMmDd [-+]val 返回YyyyMmDd前/后val日对应日的年月日
main(int argc,char *argv[])
{
    time_t current&#59;
    time_t current0&#59;
    struct tm tm_struct,*ptm&#59;

    char date8[9]&#59;
    char ymd[2]&#59;
    long int val&#59;
    char strtmp[10]&#59;
    int c&#59;
    int errbz&#59;

    errbz=0&#59;
    if(errbz==0 &amp;&amp; argc!=3) errbz=1&#59;
    if(errbz==0 &amp;&amp; strlen(argv[1])!= errbz=1&#59;

    if (errbz==0)
    {
       memset(date8,0,sizeof(date)&#59;
       memset(date8,0,sizeof(ymd))&#59;
       val=0&#59;
       strncpy(date8,argv[1],&#59;
       sscanf(argv[2],&quot;%d&quot;,&amp;val)&#59;
    }

    if (errbz==0)
    {
       for(c=0&#59;c<8&#59;c++)
         if(date8[c]<'0' || date8[c]>'9') { errbz=1&#59;break&#59; }
    }
   
    if (errbz==1)
    {
       printf(&quot;输入错误! 使用方法: 命令  日期YyyyMmDd  [+|-]value\n&quot&#59;
       return&#59;
    }


    memset(&amp;tm_struct,0,sizeof(tm_struct))&#59;
    memset(strtmp,0,sizeof(strtmp))&#59;strncpy(strtmp,date8+0,4)&#59;sscanf(strtmp,&quot;%d&quot;,&amp;tm_struct.tm_year)&#59;
    memset(strtmp,0,sizeof(strtmp))&#59;strncpy(strtmp,date8+4,2)&#59;sscanf(strtmp,&quot;%d&quot;,&amp;tm_struct.tm_mon)&#59;
    memset(strtmp,0,sizeof(strtmp))&#59;strncpy(strtmp,date8+6,2)&#59;sscanf(strtmp,&quot;%d&quot;,&amp;tm_struct.tm_mday)&#59;
    tm_struct.tm_year-=1900&#59;
    tm_struct.tm_mon-=1&#59;

    current0=mktime(&amp;tm_struct)&#59;
    current = current0&#59;
    current+=val*24*60*60&#59;
    ptm = localtime(&amp;current)&#59;     /* 获取计算结果 */
    printf(&quot;%04d%02d%02d\n&quot;,ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday)&#59;

}

论坛徽章:
0
18 [报告]
发表于 2002-10-11 11:32 |只看该作者

如何用date获得前一天的日期,忘了

#include <stdio.h>

int  date8_add(char *date8,char ymd,int value,char *date8added)&#59;
int  checkdate8(char *date&#59;
long int days_from_8zeros(char *date&#59;
int  get_data8_from_days(long int days,char *date&#59;


//功能:计算某年月日前后一定年数(或月数、天数)的年月日
//输入:
//     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]&#59;
    long int days&#59;
    int c,vyear,vmonth,vday&#59;
    int errbz&#59;

    // 检查参数date8的合法性
    errbz=checkdate8(date&#59;
    if (errbz!=0) return(-1)&#59;

    // 检查参数ymd的合法性
    if ( ymd!='y' &amp;&amp; ymd!='m' &amp;&amp; ymd!='d') return(-2)&#59;

    // 检查参数value的合法性(简单检查)
    //if ( value < -9999 || value > 9999 ) return(-3)&#59;

    // 当增加量为年数时,计算结果并返回
    if (ymd=='y')
    {
       memset(strtmp,0,sizeof(strtmp))&#59;
       memcpy(strtmp,date8+0,4)&#59;
       sscanf(strtmp,&quot;%d&quot;,&amp;vyear)&#59;
       vyear+=value&#59;
       if ( vyear<1 )    return(-4)&#59; //小于公元1年
       if ( vyear>9999 ) return(-5)&#59; //大于公元9999年

       strcpy(date8added,date&#59;
       sprintf(strtmp,&quot;%04d&quot;,vyear)&#59;
       memcpy(date8added,strtmp,4)&#59;
       errbz=checkdate8(date8added)&#59;
       if (errbz!=0)     return(-6)&#59; //计算所得结果非法
       return(0)&#59;
    }

    // 当增加量为月数时,计算结果并返回
    if (ymd=='m')
    {
       vyear=0&#59;
       vmonth=0&#59;
       vday=0&#59;
      
       memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+0,4)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vyear)&#59;
       memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+4,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vmonth)&#59;
       memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+6,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vday)&#59;

       vmonth=vyear*12+vmonth+value&#59;
       vmonth--&#59;
       vyear=vmonth/12&#59;
       vmonth=vmonth%12&#59;
       vmonth++&#59;

       if (vyear<1) return(-4)&#59;
       if (vyear>9999) return(-5)&#59;
       sprintf(date8added,&quot;%04d%02d%02d&quot;,vyear,vmonth,vday)&#59;
       errbz=checkdate8(date8added)&#59;
       if (errbz!=0) return(-6)&#59;
       return(0)&#59;
    }

    // 当增加量为天数时,计算结果并返回
    if (ymd=='d')
    {
       days=days_from_8zeros(date&#59;
       days+=value&#59;
       if (days<=366) return(-4)&#59;    //年号为0000
       if (days>3652425) return(-5)&#59; //年号超出9999
       errbz=get_data8_from_days(days,date8added)&#59;
       if (errbz!=0) return(-1)&#59;
       return(0)&#59;
    }

}


//检查日期YyyyMmdd
//输入:date8 日期字符串
//返回:0-正确  -1-错误
int  checkdate8(char *date
{
    int c&#59;
    int errdate=0&#59;
    char str_year[5]=&quot;&quot;&#59;
    char str_mon[3]=&quot;&quot;&#59;
    char str_day[3]=&quot;&quot;&#59;
    int int_year,int_mon,int_day&#59;
    int leap_year&#59;          // 1-闰年  0-不是闰年

    errdate=0&#59;
    if ( strlen(date != 8 ) errdate=1&#59;
    if (errdate!=1)
    {
       for (c=0&#59;c<10&#59;c++)
       {
         if (date8[c]==' ') errdate=1&#59;
       }
       if ( date8[0] < '0'  || date8[0] >  '9' ) errdate=1&#59;
       if ( date8[1] < '0'  || date8[1] >  '9' ) errdate=1&#59;
       if ( date8[2] < '0'  || date8[2] >  '9' ) errdate=1&#59;
       if ( date8[3] < '0'  || date8[3] >  '9' ) errdate=1&#59;
       if ( date8[4] < '0'  || date8[4] >  '9' ) errdate=1&#59;
       if ( date8[5] < '0'  || date8[5] >  '9' ) errdate=1&#59;
       if ( date8[6] < '0'  || date8[6] >  '9' ) errdate=1&#59;
       if ( date8[7] < '0'  || date8[7] >  '9' ) errdate=1&#59;
    }

    if (errdate!=1)
    {
       str_year[0]=date8[0]&#59; str_year[1]=date8[1]&#59;
          str_year[2]=date8[2]&#59; str_year[3]=date8[3]&#59;
          str_year[4]='\0'&#59;
       str_mon[0]=date8[4]&#59; str_mon[1]=date8[5]&#59; str_mon[2]='\0'&#59;
       str_day[0]=date8[6]&#59; str_day[1]=date8[7]&#59; str_day[2]='\0'&#59;
       int_year=atoi(str_year)&#59;
       int_mon=atoi(str_mon)&#59;
       int_day=atoi(str_day)&#59;

       if ( ((int_year%4)==0 &amp;&amp; (int_year%100)!=0) || (int_year%400)==0 )
             leap_year=1&#59;
       else  leap_year=0&#59;

       if ( leap_year==0 &amp;&amp; int_mon==2 &amp;&amp; int_day>28 ) errdate=1&#59;
       if ( leap_year==1 &amp;&amp; int_mon==2 &amp;&amp; int_day>29 ) errdate=1&#59;
       if ( int_mon==1 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==3 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==5 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==7 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==8 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==10 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==12 &amp;&amp; int_day>31 ) errdate=1&#59;
       if ( int_mon==4 &amp;&amp; int_day>30 ) errdate=1&#59;
       if ( int_mon==6 &amp;&amp; int_day>30 ) errdate=1&#59;
       if ( int_mon==9 &amp;&amp; int_day>30 ) errdate=1&#59;
       if ( int_mon==11 &amp;&amp; int_day>30 ) errdate=1&#59;
    }

    if ( int_mon<1 || int_mon>12 ) errdate=1&#59;
    if ( int_day<1 ) errdate=1&#59;

    if (errdate==0) return(0)&#59;
    return(-1)&#59;

}


//功能:计算日期YyyyMmDd距离虚拟的公元00000000的天数
//输入:date8
//返回:所求天数
long int days_from_8zeros(char *date
{
   int  leap&#59;       //0-平年 1-闰年
   long int days&#59;
   int  vyear,vmonth,vday&#59;
   int  c&#59;
   char strtmp[10]&#59;

   vyear=vmonth=vday=0&#59;
   memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+0,4)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vyear)&#59;
   memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+4,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vmonth)&#59;
   memset(strtmp,0,sizeof(strtmp))&#59; memcpy(strtmp,date8+6,2)&#59; sscanf(strtmp,&quot;%d&quot;,&amp;vday)&#59;


   days=0&#59;
   for (c=0&#59;c<vyear&#59;c++)
   {
       leap=0&#59;
       if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;
       if (leap==0) days+=365&#59;
       if (leap==1) days+=366&#59;
   }

   c=vyear&#59;
   leap=0&#59;
   if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;

   for (c=1&#59;c<vmonth&#59;c++)
   {
      if (c==1) days+=31&#59;
      if (c==2 &amp;&amp; leap==0) days+=28&#59;
      if (c==2 &amp;&amp; leap==1) days+=29&#59;
      if (c==3) days+=31&#59;
      if (c==4) days+=30&#59;
      if (c==5) days+=31&#59;
      if (c==6) days+=30&#59;
      if (c==7) days+=31&#59;
      if (c== days+=31&#59;
      if (c==9) days+=30&#59;
      if (c==10) days+=31&#59;
      if (c==11) days+=30&#59;
      if (c==12) days+=31&#59;
   }

   days+=vday&#59;
   return(days)&#59;

}


//功能:根据到虚拟的公元00000000的天数计算日期
//输入:days
//输出:date8
//返回:0 成功   -1 失败
int  get_data8_from_days(long int days,char *date8)
{
    long int daystmp&#59;
    int  leap&#59; // 0-平年 1-闰年
    int  c&#59;
    int  vyear,vmonth,vday&#59;

    if (days<=0) return(-1)&#59;
    daystmp=0&#59;
    for (c=0&#59;c<=9999&#59;c++)
    {
       leap=0&#59;
       if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;
       if (leap==0) daystmp+=365&#59;
       if (leap==1) daystmp+=366&#59;
       if (c==9999 &amp;&amp; days>daystmp) return(-1)&#59;
       if (days<=daystmp)
       {
          vyear=c&#59;
          if (leap==0) daystmp-=365&#59;
          if (leap==1) daystmp-=366&#59;
          break&#59;
       }
    }

    c=vyear&#59;
    leap=0&#59;
    if ( ((c%4)==0&amp;&amp;(c%100)!=0) || (c%400)==0 ) leap=1&#59;
    for (c=1&#59;c<=12&#59;c++)
    {
        // 以下这段程序借用vday
        if (c==1) vday=31&#59;
        if (c==2 &amp;&amp; leap==0) vday=28&#59;
        if (c==2 &amp;&amp; leap==1) vday=29&#59;
        if (c==3) vday=31&#59;
        if (c==4) vday=30&#59;
        if (c==5) vday=31&#59;
        if (c==6) vday=30&#59;
        if (c==7) vday=31&#59;
        if (c==8) vday=31&#59;
        if (c==9) vday=30&#59;
        if (c==10) vday=31&#59;
        if (c==11) vday=30&#59;
        if (c==12) vday=31&#59;

        daystmp+=vday&#59;
        if (days<=daystmp)
        {
           vmonth=c&#59;
           daystmp-=vday&#59;
           break&#59;
        }
    }

    vday=days-daystmp&#59;

    sprintf(date8,&quot;%04d%02d%02d&quot;,vyear,vmonth,vday)&#59;
    return(0)&#59;

}



//功能:返回两个日期相差的天数
//输入:
main(int argc,char *argv[])
{
    char date1[9]&#59;
    char date2[9]&#59;

    long int day1&#59;
    long int day2&#59;

    int errbz&#59;

    errbz=0&#59;

    //检查输入合法性
    if(errbz==0 &amp;&amp; argc!=3) errbz=-999&#59;          //参数数量错误
    if(errbz==0 &amp;&amp; strlen(argv[1])!=8) errbz=-1&#59; //第一个日期长度错
    if(errbz==0 &amp;&amp; strlen(argv[2])!=8) errbz=-2&#59; //第二个日期长度错
    if (errbz==0)
    {
       strcpy(date1,argv[1])&#59;
       strcpy(date2,argv[2])&#59;
    }
    if (errbz==0)
    {
       errbz=checkdate8(date1)&#59;
       if(errbz!=0) errbz=-1&#59;
    }
    if (errbz==0)
    {
       errbz=checkdate8(date2)&#59;
       if(errbz!=0) errbz=-2&#59;
    }
   
    if (errbz!=0)
    {
      fprintf(stderr,&quot;%d Usage: date8sub YyyyMmDd YyyyMmDd\n&quot;,errbz)&#59;
      return(errbz)&#59;
    }

    day1=days_from_8zeros(date1)&#59;
    day2=days_from_8zeros(date2)&#59;
    printf(&quot;%d\n&quot;,day1-day2)&#59;
    return(0)&#59;
}

论坛徽章:
0
19 [报告]
发表于 2002-10-11 12:09 |只看该作者

如何用date获得前一天的日期,忘了

我在工作时也会遇到需得到昨天的时间,但我手上有一个不知道是什么高人写的,而且是编译过或是加密的的小程序。把它加到SHELL中可直接得到昨天的日期。

还有,好象DATE有yesterday的参数吧。

论坛徽章:
0
20 [报告]
发表于 2002-10-11 13:06 |只看该作者

如何用date获得前一天的日期,忘了

编译后试了一下,好像可以
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP