给定年月日 怎样用C语言编程计算2个日期之间的时间天数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定年月日 怎样用C语言编程计算2个日期之间的时间天数相关的知识,希望对你有一定的参考价值。

其实是一道ACM的题目,计算天数的代码是不是很长很复杂额...
题目如下:
Description

有一种细菌,它每天都会分裂一次。例如:第一天有1个,第二天就有2个,第三天就
变成4个,……。现在告诉你第一天的日期和细菌个数,要求你编写一段程序计算将来某一
天细菌的数目。

Input

输入数据分为3行。
第一行是一个整数,代表细菌第一天的数目。
第二行是第一天的日期,格式见示例。
第三行是目标日期,格式和第二行相同。

Output

输出只有一行,即要求的那一天的细菌数(这个数字可能很大,最大有1000位)。

Sample Input

1
2009-01-01
2009-01-08

Sample Output

128

问题不难。
思路如下:
1. 要判断时间的合法性(如果不想判断也可以)
参考资料:(使用的是C++,修改之后TC下也可运行,主要是看思路)
http://hi.baidu.com/ctralt/blog/item/ee937c167e87db4b21a4e96b.html

2. 判断两个日期之间的天数
判断输入的年份是不是闰年;年份是否相同;月份是否相同;日是否相同?
同年同月最好计算,日数相减就出来了;同年不同月也好计算,计算中间相隔几个月,转换成天数,小的日期距月底有多少天,大的日期距月初多少天,三个数相加;关键是不同年的日期计算:先计算中间相隔几年,这几年的天数就出来了,再计算小的日期到年底有多少天,其次计算大的日期距年初有多少天,三个数相加就可以了。
参考资料:(也是用C++编写的,你可以把类修改为结构体,一样可以使用)
http://zhidao.baidu.com/question/55367386

以下为计算两个日期之间天数的代码:
/* 返回绝对值 */
int abs(int a,int b)

if(a>=b)
return (a-b);
else
return (b-a);


/* 判断是否为闰年:是,返回 1 ; 不是, 返回 0 . */
int IsLeap(int year)

if(((year%4==0)&&(year%100!=0))||year%400==0)
return 1;
else
return 0;


/* 判断某个日期从年初(y年1月1日)到该天(y年m月d日)的天数 */
int Days(int y,int m,int d)

int days[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
int i;
int sum = 0 ; /* 计算天数 */
if(IsLeap(y)) /* 如果为闰年,2月有 29 天 */
days[2] = 29 ;
for(i=0;i<m;i++)
sum = sum +days[i] ;
sum = sum + d - 1 ;
return sum;


/*
判断两个日期之间的天数.
日期一:年 y1,月 m1,日 d1;
日期一:年 y2,月 m2,日 d2;
*/
int DiffDays(int y1,int m1,int d1,int y2,int m2,int d2)

int s1,s2; /* 计算两个日期从年初到该日期的天数 */
int count; /* 计算两个年份之间的差值 */
int sum=0; /* */
int t,t1,t2;
if(y1==y2)

s1 = Days(y1,m1,d1);
s2 = Days(y2,m2,d2);
return abs(s1,s2);

else if(y1>y2)

count = y1 - y2 ;
if(count == 1)

t1 = Days(y1,m1,d1);
t2 = Days(y2,12,31) - Days(y2,m2,d2);
return (t1+t2+count);

else

for(t = y2+1;t<y1;t++)
sum = sum + Days(t,12,31);
cout<<sum<<endl;
t2 = Days(y2,12,31) - Days(y2,m2,d2);
t1 = Days(y1,m1,d1);
return (sum+t1+t2+count);



else

count = y2 - y1 ;
if(count == 1)

t2 = Days(y2,m2,d2);
t1 = Days(y1,12,31) - Days(y1,m1,d1);
return (t1+t2+count);

else

for(t = y1+1;t<y2;t++)
sum = sum + Days(t,12,31);
t2 = Days(y2,m2,d2);
t1 = Days(y1,12,31) - Days(y1,m1,d1);
return (sum+t1+t2+count);






/*
以上代码在Viusal C++ 6.0 编译下通过,TC下也可以通过。
使用DiffDays(int,int,int,int,int,int)这个函数就可计算出两个日期之间的天数.
至于日期的合法性,没有进行判断;也就是说,你如果输入一个不合法的日期,计算出来的结果是不正确的;如果是合法日期,那就没问题。
*/
参考技术A 问题不难。
思路如下:
1.
要判断时间的合法性(如果不想判断也可以)
参考资料:(使用的是C++,修改之后TC下也可运行,主要是看思路)
http://hi.baidu.com/ctralt/blog/item/ee937c167e87db4b21a4e96b.html
2.
判断两个日期之间的天数
判断输入的年份是不是闰年;年份是否相同;月份是否相同;日是否相同?
同年同月最好计算,日数相减就出来了;同年不同月也好计算,计算中间相隔几个月,转换成天数,小的日期距月底有多少天,大的日期距月初多少天,三个数相加;关键是不同年的日期计算:先计算中间相隔几年,这几年的天数就出来了,再计算小的日期到年底有多少天,其次计算大的日期距年初有多少天,三个数相加就可以了。
参考资料:(也是用C++编写的,你可以把类修改为结构体,一样可以使用)
http://zhidao.baidu.com/question/55367386
以下为计算两个日期之间天数的代码:
/*
返回绝对值
*/
int
abs(int
a,int
b)

if(a>=b)
return
(a-b);
else
return
(b-a);

/*
判断是否为闰年:是,返回
1
;
不是,
返回
0
.
*/
int
IsLeap(int
year)

if(((year%4==0)&&(year%100!=0))||year%400==0)
return
1;
else
return
0;

/*
判断某个日期从年初(y年1月1日)到该天(y年m月d日)的天数
*/
int
Days(int
y,int
m,int
d)

int
days[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
int
i;
int
sum
=
0
;
/*
计算天数
*/
if(IsLeap(y))
/*
如果为闰年,2月有
29

*/
days[2]
=
29
;
for(i=0;i<m;i++)
sum
=
sum
+days[i]
;
sum
=
sum
+
d
-
1
;
return
sum;

/*
判断两个日期之间的天数.
日期一:年
y1,月
m1,日
d1;
日期一:年
y2,月
m2,日
d2;
*/
int
DiffDays(int
y1,int
m1,int
d1,int
y2,int
m2,int
d2)

int
s1,s2;
/*
计算两个日期从年初到该日期的天数
*/
int
count;
/*
计算两个年份之间的差值
*/
int
sum=0;
/*
*/
int
t,t1,t2;
if(y1==y2)

s1
=
Days(y1,m1,d1);
s2
=
Days(y2,m2,d2);
return
abs(s1,s2);

else
if(y1>y2)

count
=
y1
-
y2
;
if(count
==
1)

t1
=
Days(y1,m1,d1);
t2
=
Days(y2,12,31)
-
Days(y2,m2,d2);
return
(t1+t2+count);

else

for(t
=
y2+1;t<y1;t++)
sum
=
sum
+
Days(t,12,31);
cout<<sum<<endl;
t2
=
Days(y2,12,31)
-
Days(y2,m2,d2);
t1
=
Days(y1,m1,d1);
return
(sum+t1+t2+count);


else

count
=
y2
-
y1
;
if(count
==
1)

t2
=
Days(y2,m2,d2);
t1
=
Days(y1,12,31)
-
Days(y1,m1,d1);
return
(t1+t2+count);

else

for(t
=
y1+1;t<y2;t++)
sum
=
sum
+
Days(t,12,31);
t2
=
Days(y2,m2,d2);
t1
=
Days(y1,12,31)
-
Days(y1,m1,d1);
return
(sum+t1+t2+count);



/*
以上代码在Viusal
C++
6.0
编译下通过,TC下也可以通过。
使用DiffDays(int,int,int,int,int,int)这个函数就可计算出两个日期之间的天数.
至于日期的合法性,没有进行判断;也就是说,你如果输入一个不合法的日期,计算出来的结果是不正确的;如果是合法日期,那就没问题。
*/
参考技术B #include<stadio.h>
main()

int
year,year1,month,month1,day,day1,age;
printf("请输入您的生日:");
scanf("%d
%d
%d",&year,&month,&day);
printf("请输入当前日期:");
scanf("%d
%d
%d",&year1,&month1,&day1);
if(year1==year)
age=0;
else
age=year1-year;
if(month1<month||(month1==month&&day1<day))
age=age-1;

printf("您的年龄是:%d",age);

大概就是这个样子,我没有调试,可能有错误,但应该都是小问题,你自己调试一下,觉得哪儿不妥,可以自己改动。
参考技术C 直接算两个日期距离公元元年1月1日的天数:

若干个完整的年,若干个完整的月,若干天,加起来之后两个天数相减就行了.

日期的合法性,闰年之类的就不罗嗦了.

SQL 中怎么根据出生日期算出年龄 然后用年龄查询

sql是不能查询的,php可以计算年龄

1、取得当前日期的时间

2、将sql中的出生日期换算成时间

3、当前日期时间-出生日期时间

4、将得到的数值转换为年月日

参考技术A select *
from 表名
where (case when (dateadd(yy,DATEdiff(yy,出生日期,比较的日期),出生日期)>比较的日期)
then (DATEdiff(yy,出生日期,比较的日期)-1)
else DATEdiff(yy,出生日期,比较的日期)
end)>15
查找截止到比较的日期年龄大于15岁的人
case when 是sql server语法,其它数据库用相应的函数替换
参考技术B select *,datediff(year,birth,getdate()) as 年龄 from table where datediff(year,birth,getdate()) >='20'本回答被提问者和网友采纳 参考技术C 这个和编程语言差不多,先定义一个变量,然后用现在的年分减去这个变量,就得到了年龄

以上是关于给定年月日 怎样用C语言编程计算2个日期之间的时间天数的主要内容,如果未能解决你的问题,请参考以下文章

用C语言写一个函数,给出年月日,计算该日是该年的第几天

用SQL语句计算出给定日期是星期几?

用SQL语句计算出给定日期是星期几?

如何实现秒数和日期之间的转换

用C语言写一个函数,给出年月日,计算该日是该年的第几天

VC有一个计算两个日期之间的函数是啥我想不起来了