有的时候在程序中往往需要用到一个日期后面的一天日期,为了方便以后工作中还会用到,写个模板来方便以后调用,下面为实现的demo程序
//tomorrow.c
/*************************************************************************************************
FileName : tomorrow.c
FileFunc : 给出一个日期(YYYYMMDD),返回这个日期后面的一天(给出的和返回的日期都是字符串格式)
Version : V0.1
Author : Sunrier
Date : 2012-07-04 13:38:03
Descp : Linux下实现给定一个日期求出后面的一天
*************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <time.h>
typedef unsigned long ulYear;
typedef unsigned long ulMonth;
typedef unsigned long ulDay;
void GetLocalTime( char *pOutTime )
{
time_t t;
struct tm tm1;
t = time(NULL);
memcpy(&tm1,localtime(&t),sizeof(struct tm));
sprintf(pOutTime,"%04d%02d%02d",tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday);
/*sprintf(pOutTime,"%04d-%02d-%02d %02d:%02d:%02d",tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);*/
/*YYYYMMDDHHMMSS(年月日时分秒) */
}
unsigned long asc_long(unsigned char *pucSrc,unsigned int uiLen)
{
unsigned int uiI;
unsigned long ulTmp1,ulTmp2;
ulTmp1 = 0 ;
ulTmp2 = 1 ;
pucSrc += uiLen ;
for (uiI = 0; uiI< uiLen ; uiI++)
{
ulTmp1 += (ulTmp2 * (*--pucSrc & 0x0F) ) ;
ulTmp2 *= 10 ;
}
return (ulTmp1) ;
}
unsigned char *long_asc( unsigned char *pucDest,unsigned int uiLen,unsigned long ulSrc )
{
unsigned int uiI;
unsigned char ucCh;
unsigned char aucTab[10];
unsigned char *pucPtr;
unsigned long ulTmp1,ulTmp2;
ulTmp1 = ulSrc;
ulTmp2 = 100000000L ;
for (uiI = 0; uiI< 5; uiI++)
{
ucCh = (unsigned char)(ulTmp1 / ulTmp2) ;
aucTab[2*uiI] = ucCh / 10 + 0x30 ;
aucTab[2*uiI+1] = ucCh % 10 + 0x30;
ulTmp1 = ulTmp1 % ulTmp2;
ulTmp2 = ulTmp2 / 100;
}
memset( pucDest, 0x30, uiLen ) ;
pucDest += uiLen ;
pucPtr = pucDest ;
if ( uiLen > 10 )
uiLen = 10 ;
for( uiI=0; uiI < uiLen;uiI++)
*--pucDest = aucTab[9-uiI] ;
return( (unsigned char*)pucPtr );
}
int dateAdd(char *pcDate,char *pcDateAdd)
{
unsigned char ucLeapYearFlag = 0;
ulYear year = 0;
ulMonth month = 0;
ulDay day = 0;
year = asc_long((unsigned char*)pcDate, 4);
month = asc_long((unsigned char*)pcDate+4, 2);
day = asc_long((unsigned char*)pcDate+6, 2);
if((year%4==0 && year%100!=0) || (year%400==0))
ucLeapYearFlag = 1;
day += 1;
switch( month )
{
case 1:
if(day > 31)
{
day = 1;
month += 1;
}
break;
case 2:
if( ucLeapYearFlag )
{
if(day > 29)
{
day = 1;
month += 1;
}
}
else
{
if(day > 28)
{
day = 1;
month += 1;
}
}
break;
case 3:
if(day > 31)
{
day = 1;
month += 1;
}
break;
case 4:
if(day > 30)
{
day = 1;
month += 1;
}
break;
case 5:
if(day > 31)
{
day = 1;
month += 1;
}
break;
case 6:
if(day > 30)
{
day = 1;
month += 1;
}
break;
case 7:
if(day > 31)
{
day = 1;
month += 1;
}
break;
case 8:
if(day > 31)
{
day = 1;
month += 1;
}
break;
case 9:
if(day > 30)
{
day = 1;
month += 1;
}
break;
case 10:
if(day > 31)
{
day = 1;
month += 1;
}
break;
case 11:
if(day > 30)
{
day = 1;
month += 1;
}
break;
case 12:
if(day > 31)
{
day = 1;
month = 1;
year += 1;
}
break;
default :
return 1;
}
long_asc((unsigned char*)pcDateAdd, 4, year);
long_asc((unsigned char*)pcDateAdd+4, 2, month);
long_asc((unsigned char*)pcDateAdd+6, 2, day);
return 0;
}
//demo.c
/*******************************************************************************************
FileName : demo.c
FileFunc : 定义测试文件
Version : V0.1
Author : Sunrier
Date : 2012-07-04 13:37:00
Descp : Linux下实现给定一个日期求出后面的一天(给出的和返回的日期都是字符串格式)
*******************************************************************************************/
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
unsigned char aucDate[30],aucDateAdd[30];
memset(aucDate,0,sizeof(aucDate));
GetLocalTime(aucDate);
memset(aucDateAdd,0,sizeof(aucDateAdd));
dateAdd(aucDate,aucDateAdd);
printf("%s\n",aucDate);
printf("%s\n",aucDateAdd);
return 0;
}
//makefile
#makefile
OBJS = demo
all:$(OBJS)
CFLAGS = -O -w -ansi
#CFLAGS = -O -Wall -ansi
CC = gcc $(CFLAGS)
demo:demo.c tomorrow.c
@$(CC) -o $@ $?
clean :
@ls | grep -v ^makefile$$ | grep -v [.]c$$ | grep -v [.]h$$ | grep -v [.]sql$$ | grep -v [.]sh$$ | xargs rm -rf
#makefile
[Sunrier@localhost Date]$ ls
demo.c makefile tomorrow.c
[Sunrier@localhost Date]$ make
[Sunrier@localhost Date]$ ls
demo demo.c makefile tomorrow.c
[Sunrier@localhost Date]$ ./demo
20120704
20120705
[Sunrier@localhost Date]$