- 论坛徽章:
- 0
|
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 编辑 ] |
|