免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3192 | 回复: 3
打印 上一主题 下一主题

[SCO UNIX] 怎样计算一个日期在一年以后的日期? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-25 20:23 |只看该作者 |倒序浏览
怎样计算一个日期在一年以后的日期?
如:2007年2月28日一年后的日期,以此类推

论坛徽章:
0
2 [报告]
发表于 2007-07-25 21:38 |只看该作者
年数加一、日期照抄不就行了?闰年的2月29日另说
另外,你这个问题本身有问题。你是指一“年”后的某天、还是指365天后的某天?如果是指一“年”后的某天,那这个年是否是闰年?题目太含糊了!

论坛徽章:
0
3 [报告]
发表于 2007-08-21 16:56 |只看该作者
int DateAdd(struct tm *p,long add_day,char *fmt)
{
        long add_num;
        long add_year,add_mon;
        time_t now;

        add_num=add_day;
        if(memcmp(fmt,"dd",2) == 0)
        {
                if((now=mktime(p)) == (time_t)-1) return -1;
                now=now+add_num*DAY_HOUR;
                p=localtime(&now);
        }
        else
        {
        if(memcmp(fmt,"mm",2) == 0) p->tm_mon=p->tm_mon+add_num;
        if(memcmp(fmt,"yy",2) == 0) p->tm_year=p->tm_year+add_num;
        }
        if(mktime(p) == (time_t)-1) return -1;
        return 0;
}


struct tm *StoDate(char *trdt)
{
        struct tm *t;
        time_t now;
        int i_year,i_mm,i_dd;
        char s_year[5];
        char s_mm[3];
        char s_dd[3];
       

        time(&now);
           t=localtime(&now);

        memcpy(s_year,trdt,4);
        s_year[4]=0;
        i_year=atoi(s_year);

        memcpy(s_mm,trdt+4,2);
        s_mm[2]=0;
        i_mm=atoi(s_mm);

        memcpy(s_dd,trdt+6,2);
        s_dd[2]=0;
        i_dd=atoi(s_dd);
       
        /****校验日期***/
        switch(i_mm)
        {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                        if(i_dd>31 || i_dd<1) return NULL;
                        break;
                case 4:
                case 6:
                case 9:
                case 11:
                        if(i_dd>30 || i_dd<1) return NULL;
                        break;
                case 2:
        if((i_year % 400 == 0) || ((i_year % 4 == 0) && (i_year % 100 !=0)))
        {
                if(i_dd>29 && i_dd <0) return NULL;
        }
        else
        {
                if(i_dd<0 && i_dd>2 return NULL;
        }
                break;
       
                default:
                        return NULL;
                break;
               
               
        }


        t->tm_year=i_year-1900;
        i_mm--; /***月份是0--11***/

        t->tm_mday=i_dd;
        t->tm_mon=i_mm;
        t->tm_hour=0;
        t->tm_min=0;
        t->tm_sec=0;
        if(mktime(t) == (time_t)-1) return NULL;
#ifdef DEBUG
        printf("wday=[%d]\n",t->tm_wday);
        printf("yday=[%d]\n",t->tm_yday);
        printf("isdst=[%d]\n",t->tm_isdst);
        printf("tm_tzadj=[%ld]\n",t->tm_tzadj);
        printf("tm_name=[%s]\n",t->tm_name);
#endif
        return t;
}
void DateAdd1(char *trdt,long add_day,char *trdt1,char *fmt)
{
   struct tm *p;

   p=(struct tm *)StoDate(trdt);
   DateAdd(p,add_day,fmt);
   DateToS(p,trdt1,0);
}

只要调用DateAdd1就可以了。例子:trdt 8位年月日,add_day表示你要增加的天数或月份,年数,可以为负数,表示倒推,fmt表示基数dd-天,mm-月,yy-年
3年后的今天ateAdd1("20070821",3,trdt1,"yy";或者DateAdd1("20070821",3*365,trdt1,dd);
8个月前的今天ateAdd1("20070821",-8,trdt1,"mm";
1000天以后的日期ateAdd1("20070821”,1000,trdt1,"dd";
同样如果你要知道你所求的日期是星期几只需要打印出p->tm_wday就可以了

[ 本帖最后由 jlogzl 于 2007-8-21 17:03 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-08-21 17:07 |只看该作者
int DateAdd(struct tm *p,long add_day,char *fmt)
{
        long add_num;
        long add_year,add_mon;
        time_t now;

        add_num=add_day;
        if(memcmp(fmt,"dd",2) == 0)
        {
                if((now=mktime(p)) == (time_t)-1) return -1;
                now=now+add_num*DAY_HOUR;
                p=localtime(&now);
        }
        else
        {
        if(memcmp(fmt,"mm",2) == 0) p->tm_mon=p->tm_mon+add_num;
        if(memcmp(fmt,"yy",2) == 0) p->tm_year=p->tm_year+add_num;
        }
        if(mktime(p) == (time_t)-1) return -1;
        return 0;
}


struct tm *StoDate(char *trdt)
{
        struct tm *t;
        time_t now;
        int i_year,i_mm,i_dd;
        char s_year[5];
        char s_mm[3];
        char s_dd[3];
        

        time(&now);
           t=localtime(&now);

        memcpy(s_year,trdt,4);
        s_year[4]=0;
        i_year=atoi(s_year);

        memcpy(s_mm,trdt+4,2);
        s_mm[2]=0;
        i_mm=atoi(s_mm);

        memcpy(s_dd,trdt+6,2);
        s_dd[2]=0;
        i_dd=atoi(s_dd);
        
        /****校验日期***/
        switch(i_mm)
        {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                        if(i_dd>31 || i_dd<1) return NULL;
                        break;
                case 4:
                case 6:
                case 9:
                case 11:
                        if(i_dd>30 || i_dd<1) return NULL;
                        break;
                case 2:
        if((i_year % 400 == 0) || ((i_year % 4 == 0) && (i_year % 100 !=0)))
        {
                if(i_dd>29 && i_dd <0) return NULL;
        }
        else
        {
                if(i_dd<0 && i_dd>2) return NULL;
        }
                break;
        
                default:
                        return NULL;
                break;
               
               
        }


        t->tm_year=i_year-1900;
        i_mm--; /***月份是0--11***/

        t->tm_mday=i_dd;
        t->tm_mon=i_mm;
        t->tm_hour=0;
        t->tm_min=0;
        t->tm_sec=0;
        if(mktime(t) == (time_t)-1) return NULL;
#ifdef DEBUG
        printf("wday=[%d]\n",t->tm_wday);
        printf("yday=[%d]\n",t->tm_yday);
        printf("isdst=[%d]\n",t->tm_isdst);
        printf("tm_tzadj=[%ld]\n",t->tm_tzadj);
        printf("tm_name=[%s]\n",t->tm_name);
#endif
        return t;
}
void DateAdd1(char *trdt,long add_day,char *trdt1,char *fmt)
{
   struct tm *p;

   p=(struct tm *)StoDate(trdt);
   DateAdd(p,add_day,fmt);
   DateToS(p,trdt1,0);
}

只要调用DateAdd1就可以了。例子:trdt 8位年月日,add_day表示你要增加的天数或月份,年数,可以为负数,表示倒推,fmt表示基数dd-天,mm-月,yy-年
3年后的今天DateAdd1("20070821",3,trdt1,"yy");或者DateAdd1("20070821",3*365,trdt1,dd);
8个月前的今天DateAdd1("20070821",-8,trdt1,"mm");
1000天以后的日期DateAdd1("20070821”,1000,trdt1,"dd");
同样如果你要知道你所求的日期是星期几只需要打印出p->tm_wday就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP