社区
C语言
帖子详情
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
验证正确后马上给分
...全文
662
5
打赏
收藏
100分求DateAdd函数
求两个日期相差的天数,希望各位高手写一个函数 char * DateAdd(const char * strdate,int i,char diff[]) strdate是日期也可以是不完整的日期,例如20070813。 i表示相差的间隔数可以是负数。 diff是区分,'y'表示年,'m'表示月,d'-表示天,'w'表示周。 例如 DateAdd(“20070816”,-5,‘m’)返回20070316 验证正确后马上给分
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
access
Date
Add
函数
本文详细介绍了
Date
Add
函数
的使用方法,包括其语法、参数及设置。通过实例展示了如何使用此
函数
进行日期加减运算,如计算30天后的日期或45分钟前的时间。文章还特别指出
Date
Add
函数
不会返回无效日期,并提供了处理闰年的示例。
SQL Server 使用
DATE
ADD
()
函数
实现秒、分钟、小时、日、周、月份、季度、年份加减
本文详细介绍了
DATE
ADD
()
函数
的使用方法,该
函数
用于在日期中添加或减去指定的时间间隔,包括秒、分钟、小时、日、周、月、季度和年份。通过实例演示了如何进行时间的加减操作。
mysql sql
date
add
_在SQL语句中
DATE
ADD
和
DATE
DIFF
函数
本文详细介绍了SQL中的
DATE
ADD
和
DATE
DIFF
函数
的使用方法,包括如何添加或减去指定的时间间隔,以及如何计算两个日期之间的间隔数量。通过示例展示了这些
函数
在实际应用中的操作。
Access的
Date
Add
函数
本文介绍了Access中的
Date
Add
函数
,详细解释了如何通过此
函数
来添加或减少日期与时间间隔,包括参数说明及注意事项。
Date
Add
函数
本文详细介绍了SQL中的
Date
Add
函数
,该
函数
用于在已知日期基础上增加或减少指定的时间间隔,如年、月、日等。通过示例展示了如何使用
Date
Add
函数
计算未来或过去的日期,特别注意闰年和日期有效性的问题。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章