100分求DateAdd函数

caofusheng 2007-08-14 10:15:36
求两个日期相差的天数,希望各位高手写一个函数
char * DateAdd(const char * strdate,int i,char diff[])
strdate是日期也可以是不完整的日期,例如20070813。
i表示相差的间隔数可以是负数。
diff是区分,'y'表示年,'m'表示月,d'-表示天,'w'表示周。
例如 DateAdd(“20070816”,-5,‘m’)返回20070316

验证正确后马上给分
...全文
631 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mynbasky 2008-01-04
  • 打赏
  • 举报
回复
zhuying1983做的很好
caofusheng 2007-08-14
  • 打赏
  • 举报
回复
zhuying1983(竹影) 写的i是负数的情况下不对。
www_adintr_com 2007-08-14
  • 打赏
  • 举报
回复
......

#include <stdio.h>
#include <time.h>

char * DateAdd(const char * strdate,int i,char diff)
{
static char buff[1024];

tm input;
memset(&input, 0, sizeof(input));
sscanf(strdate, "%04d%02d%02d", &input.tm_year, &input.tm_mon, &input.tm_mday);

if(diff == 'y')
input.tm_year += i;
else if(diff == 'm')
input.tm_mon += i;
else if(diff == 'd')
input.tm_mday += i;
else if(diff == 'w')
input.tm_mday += i * 7;

input.tm_year -= 1900;
input.tm_mon -= 1;

time_t tp = mktime(&input);
tm* nt = localtime(&tp);

sprintf(buff, "%04d%02d%02d", nt->tm_year + 1900, nt->tm_mon + 1, nt->tm_mday);

return buff;
}
zhuying1983 2007-08-14
  • 打赏
  • 举报
回复
/*求两个日期相差的天数
char * DateAdd(const char * strdate,int i,char diff[])
strdate是日期也可以是不完整的日期,例如20070813。
i表示相差的间隔数可以是负数。
diff是区分,'y'表示年,'m'表示月,d'-表示天,'w'表示周。
例如 DateAdd(“20070816”,-5,‘m’)返回20070316*/

#include<stdio.h>
//每个月的天数
int day_perMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
char rst[9]; //返回结果
//判断是否为闰年
int check_year(int year)
{
if(year % 400 == 0)
{
return 1;
}
else if(year % 100 == 0)
{
return 0;
}
else if( year % 4 == 0)
{
return 1;
}
else
{
return 0;
}
}

char * DateAdd(const char * strdate,int i, char diff)
{
int year;
int month;
int day;
int t1,t2;
//char rst[9];
//处理strdate,初始化year,month,day,前四个字符是year,接着两个是month,再接着是day
year = (strdate[0] - 0x30) * 1000 + (strdate[1] - 0x30) * 100 + (strdate[2] - 0x30) * 10 + (strdate[3] - 0x30);
month = (strdate[4] - 0x30) * 10 + (strdate[5] - 0x30);
day = (strdate[6] - 0x30) * 10 + (strdate[7] - 0x30);

//diff是区分,'y'表示年,'m'表示月,d'-表示天,'w'表示周。
//对于'y',直接处理
//对于'm',转化成几年几个月
//对于'w',转化成'd'
//主要难度是对'd'的处理,每个月天数不等,还要考虑到闰年

if( diff == 'y')
{
year += i;
}
else if( diff == 'm')
{
if( i < 0)
{
i = 0 - i;
t1 = i / 12;
t2 = i % 12;
year -= t1;
month -= t2;
if(month <= 0)
{
year--;
month += 12;
}
}
if(i > 0)
{
t1 = i / 12;
t2 = i % 12;
year += t1;
month += t2;
if( month > 12)
{
year++;
month -= 12;
}
}
}
else if( diff == 'w' || diff == 'd')
{
if(diff == 'w')
{
i *= 7; //转换为'd'
}
while(1)
{
if(day > i)
{
day -= i;
break;
}
else
{
i -= day;
month--;
if(month == 0)
{
year --;
month = 12;
}
if(check_year(year) && month == 2)
{
day = day_perMonth[month] + 1;
}
else
{
day = day_perMonth[month];
}
}
}
}
else
{
printf("erro");
}

rst[0] = year / 1000 + 0x30;
rst[1] = (year%1000) / 100 + 0x30;
rst[2] = (year%100) / 10 + 0x30;
rst[3] = year % 10 + 0x30;
rst[4] = month / 10 + 0x30;
rst[5] = month % 10 + 0x30;
rst[6] = day / 10 + 0x30;
rst[7] = day % 10 + 0x30;
rst[8] = '\0';


return rst;
}

int main()
{
char date[9] = "20070814";
char* rst = DateAdd(date,100,'d');
printf("the result is %s",rst);
return 0;
}
zhuying1983 2007-08-14
  • 打赏
  • 举报
回复
处理'd'时,忘了考虑i的正负了
现修改后如下
/*求两个日期相差的天数
char * DateAdd(const char * strdate,int i,char diff[])
strdate是日期也可以是不完整的日期,例如20070813。
i表示相差的间隔数可以是负数。
diff是区分,'y'表示年,'m'表示月,d'-表示天,'w'表示周。
例如 DateAdd(“20070816”,-5,‘m’)返回20070316*/

#include<stdio.h>
//每个月的天数
int day_perMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
char rst[9]; //返回结果
//判断是否为闰年
int check_year(int year)
{
if(year % 400 == 0)
{
return 1;
}
else if(year % 100 == 0)
{
return 0;
}
else if( year % 4 == 0)
{
return 1;
}
else
{
return 0;
}
}

char * DateAdd(const char * strdate,int i, char diff)
{
int year;
int month;
int day;
int t1,t2;
//char rst[9];
//处理strdate,初始化year,month,day,前四个字符是year,接着两个是month,再接着是day
year = (strdate[0] - 0x30) * 1000 + (strdate[1] - 0x30) * 100 + (strdate[2] - 0x30) * 10 + (strdate[3] - 0x30);
month = (strdate[4] - 0x30) * 10 + (strdate[5] - 0x30);
day = (strdate[6] - 0x30) * 10 + (strdate[7] - 0x30);

//diff是区分,'y'表示年,'m'表示月,d'-表示天,'w'表示周。
//对于'y',直接处理
//对于'm',转化成几年几个月
//对于'w',转化成'd'
//主要难度是对'd'的处理,每个月天数不等,还要考虑到闰年

if( diff == 'y')
{
year += i;
}
else if( diff == 'm')
{
if( i < 0)
{
i = 0 - i;
t1 = i / 12;
t2 = i % 12;
year -= t1;
month -= t2;
if(month <= 0)
{
year--;
month += 12;
}
}
if(i > 0)
{
t1 = i / 12;
t2 = i % 12;
year += t1;
month += t2;
if( month > 12)
{
year++;
month -= 12;
}
}
}
else if( diff == 'w' || diff == 'd')
{
if(diff == 'w')
{
i *= 7; //转换为'd'
}
if( i < 0)
{
i = 0 - i;
while(1)
{
if(day > i)
{
day -= i;
break;
}
else
{
i -= day;
month--;
if(month == 0)
{
year --;
month = 12;
}
if(check_year(year) && month == 2)
{
day = day_perMonth[month] + 1;
}
else
{
day = day_perMonth[month];
}
}
}
}
else
{
while(1)
{
if(check_year(year) && month == 2)
{
t1 = day_perMonth[month] + 1;
}
else
{
t1 = day_perMonth[month];
}

if(t1 - day >= i)
{
day = day + i;
break;
}
else
{
i -= (t1 - day);
day = 0;
month ++;
if(month > 12)
{
month -= 12;
year++;
}
}
}
}
}
else
{
printf("erro");
}

rst[0] = year / 1000 + 0x30;
rst[1] = (year%1000) / 100 + 0x30;
rst[2] = (year%100) / 10 + 0x30;
rst[3] = year % 10 + 0x30;
rst[4] = month / 10 + 0x30;
rst[5] = month % 10 + 0x30;
rst[6] = day / 10 + 0x30;
rst[7] = day % 10 + 0x30;
rst[8] = '\0';


return rst;
}

int main()
{
char date[9] = "20070814";
char* rst = DateAdd(date,-100,'d');
printf("the result is %s",rst);
return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧