计算两个日期之间的天数c语言
㈠ 用c语言编写计算两个日期之间的天数
#include <time.h>
#include <stdio.h>
void main()
{
tm t1={0},t2={0};
t1.tm_year = 1999-1900;
t1.tm_mon = 2-1;
t1.tm_mday = 3;
t2.tm_year = 2015-1900;
t2.tm_mon = 5-1;
t2.tm_mday = 4;
time_t a1 = mktime(&t1);
time_t a2 = mktime(&t2);
printf("相差%d天", (a2-a1)/86400);
}
ps:看不懂了再追问
㈡ C语言中 求两个日期间的天数
以前做的C语言实习作业......
要把年、月、日分开来求...
#include <stdio.h>
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /*储存12个月的天数*/
void main()
{
int spec_year(int);
void scan(int *year,int *month,int *day);
long com_year(int y1,int y2);
int com_month(int y1,int m1,int y2,int m2);
int com_day(int y1,int m1,int d1,int y2,int m2,int d2);
int year1,month1,day1;
int year2,month2,day2;
long sum=0;
int k=0;
/*输入两个日期,做合法性检查*/
printf("Enter the first date,like 1988 11 30:");
scan(&year1,&month1,&day1);
printf("Enter the second date,like 1988 11 30:");
scan(&year2,&month2,&day2);
/*当输入的第一个日期比第二个日期大时,将二者对换*/
if((year1>year2)||((year1==year2)&&(month1>month2))||((year1==year2)&&(month1==month2)&&(day1>day2)))
{
int temp;
temp=year1;year1=year2;year2=temp;
temp=month1;month1=month2;month2=temp;
temp=day1;day1=day2;day2=temp;
}
/*计算两个日期之间的天数*/
sum+=com_year(year1,year2); /*计算两个年份之间的天数*/
sum+=com_month(year1,month1,year2,month2); /*计算两个月份之间的天数*/
sum+=com_day(year1,month1,day1,year2,month2,day2); /*计算两天之间的天数*/
/*输出*/
printf("There are %ld days between them.\n",sum);
}
void scan(int *year,int *month,int *day) /*输入日期函数,合法性判断*/
{
int k=0;
do
{
if(k!=0)
printf("\nWrong date!\n");
k++;
/*printf("Please write down the day,like 1988 11 30:");*/
scanf("%d%d%d",year,month,day);
if(spec_year(*year))
mon[1]=29;
}while(*day>mon[*month-1]||*month>13||*year<1900||*year>3000);
mon[1]=28;
}
long com_year(int y1,int y2) /*计算两个年份之间的天数*/
{
int i;
long sum=0;
for(i=y1+1;i<y2;i++)
{
if(spec_year(i))
sum+=366;
else
sum+=365;
}
return sum;
}
int com_month(int y1,int m1,int y2,int m2) /*计算两个月份之间的天数*/
{
int i;
int sum=0;
if(y1!=y2)
{
if(spec_year(y1))
{
mon[1]=29;
}
if(m1!=m2)
{
for(i=m1;i<12;i++)
{
sum+=mon[i];
}
mon[1]=28;
if(spec_year(y2))
{
mon[1]=29;
}
for(i=0;i<m2-1;i++)
{
sum+=mon[i];
}
mon[1]=28;
}
else
{
for(i=m1-1;i<12;i++)
{
sum+=mon[i];
}
mon[1]=28;
if(spec_year(y2))
{
mon[1]=29;
}
for(i=0;i<m2-1;i++)
{
sum+=mon[i];
}
mon[1]=28;
}
}
else
{
if(spec_year(y1))
{
mon[1]=29;
}
for(i=m1;i<m2-1;i++)
{
sum+=mon[i];
}
mon[1]=28;
}
return sum;
}
int com_day(int y1,int m1,int d1,int y2,int m2,int d2) /*计算两天之间的天数*/
{
int i;
int sum=0;
if(m1!=m2)
{
if(spec_year(y1))
{
mon[1]=29;
}
sum+=(mon[m1-1]-d1);
sum+=d2;
mon[1]=28;
}
else
{
sum+=d2-d1;
}
return sum;
}
int spec_year(int year) /*判断是否为闰年*/
{
if((year%400==0)||((year%4==0)&&(year%100!=0)))
return 1;
else
return 0;
}
㈢ 给定年月日 怎样用C语言编程计算2个日期之间的时间天数
问题不难。
思路如下:
1. 要判断时间的合法性(如果不想判断也可以)
参考资料:(使用的是C++,修改之后TC下也可运行,主要是看思路)
http://hi..com/ctralt/blog/item/ee937c167e87db4b21a4e96b.html
2. 判断两个日期之间的天数
判断输入的年份是不是闰年;年份是否相同;月份是否相同;日是否相同?
同年同月最好计算,日数相减就出来了;同年不同月也好计算,计算中间相隔几个月,转换成天数,小的日期距月底有多少天,大的日期距月初多少天,三个数相加;关键是不同年的日期计算:先计算中间相隔几年,这几年的天数就出来了,再计算小的日期到年底有多少天,其次计算大的日期距年初有多少天,三个数相加就可以了。
参考资料:(也是用C++编写的,你可以把类修改为结构体,一样可以使用)
http://..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)这个函数就可计算出两个日期之间的天数.
至于日期的合法性,没有进行判断;也就是说,你如果输入一个不合法的日期,计算出来的结果是不正确的;如果是合法日期,那就没问题。
*/
㈣ 用C语言求两个日期之间的天数,急!!
太多地方有问题了 按你的写法给你改了一下 自己比对一下
#include "stdio.h"
#include "conio.h"
void main()
{
int i,y,m1,m2,d1,d2;
int d=0;
scanf("%d,%d,%d,%d,%d",&y,&m1,&d1,&m2,&d2);
y=(y%4==0&&y%100!=0||y%400==0)?1:0;
for(i=m1;i<m2;i++)
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
d+=31;
break;
case 4:
case 6:
case 9:
case 11:
d+=30;
break;
case 2:
d=d+28+y;
break;
}
printf("%d",d+d2-d1);
getch();
}
㈤ C语言求两个日期相差的天数
计算两个年月日之间的天数,思路是分别算出日期的总天数然后相减。
要考虑闰年的情况,判断闰年的口诀:4年一闰,100年不闰,400年再闰。
((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
网上找了一个(偷懒= =!),修改下如下:
#include <stdio.h>
int sum(int y,int m,int d)
{
unsigned char x[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i,s=0;
for(i=1;i<y;i++)
if(i%4==0 && i%100!=0 || i%400==0)
s+=366;//闰年
else
s+=365;//平年
if(y%4==0 && y%100!=0 || y%400==0)
x[2]=29;
for(i=1;i<m;i++)
s+=x[i];//整月的天数
s+=d;//日的天数
return s;//返回总天数,相对公元1年
}
void main()
{
unsigned char y1,m1,d1,y2,m2,d2;
int s1,s2;
printf("输入第一个年 月 日:");
scanf("%d %d %d",&y1,&m1,&d1);
printf("输入第二个年 月 日:");
scanf("%d %d %d",&y2,&m2,&d2);
s1=sum(y1,m1,d1);
s2=sum(y2,m2,d2);
if (s1 > s2)
printf("相差天数:%ld\n",s1-s2);
else
printf("相差天数:%ld\n",s2-s1);
}
以上代码VC6编译测试通过。
虽然这个思路显得有些笨,但是其它算法,代码太长太复杂,要考虑多种情况,不如直接算两个日期距离公元元年1月1日的天数,然后相减
㈥ 用c语言编程计算两个日期之间的天数
直接算两个日期距离公元元年1月1日的天数:
若干个完整的年,若干个完整的月,若干天,加起来之后两个天数相减就行了.
日期的合法性,闰年之类的就不罗嗦了.
㈦ 如何用c语言来计算日期间隔天数
楼上的说的太麻烦了(真是傻瓜做法)//定义两个时间DateTime time1=Convert.ToDateTime("2006-05-23");DateTime time2=Convert.ToDateTime("2045-12-15");//计算间隔天数(精确到毫秒格式为“2222.22.22.2222”)TimeSpan span = (TimeSpan)(time2-time1);int result = Convert.ToInt32(Convert.ToString(span).SubString(0,Convert.ToString(span).IndexOf(".")));//result就是你要的天数
㈧ C语言求任意两个日期间的天数,有代码但报错
//代码错误是:printf写成了pritnf
//代码考虑的不周全,如果输入的是同一年,那代码怎么计算,还有不同年计算也有大问题
//你的代码思路看的我头大,干脆没看,在你的代码基础上直接给改了,供参考
//这个代码中注释的应该很清楚,有疑问可以追问
#include<stdio.h>
intleap(intyear)
{
if(year%4==0||year%400==0&&year%100!=0)
return1;
else
return0;
}
inta[12]={31,29,31,30,31,30,31,31,30,31,30,31};/*闰年月份天数*/
intb[12]={31,28,31,30,31,30,31,31,30,31,30,31};
voidmain()
{
intt,s,i,t1=0,n=0,n2=365,n1=366;/*s为总天数,n为年中间天数*/
inty1,m1,d1;
inty2,m2,d2;
printf("请输入第一个年月日: ");
scanf("%d%d%d",&y1,&m1,&d1);
printf("请输入第二个年月日: ");
scanf("%d%d%d",&y2,&m2,&d2);
if(m1>12||d1>31||m2>12||d2>31)
{
printf("输入有误,请重输!");
return;//加个错误退出
}
//先输入的是较后的年月日,就交换过来
if(y1*10000+m1*100+d1>y2*10000+m2*100+d2)
{
t=y1;y1=y2;y2=t;
t=m1;m1=m2;m2=t;
t=d1;d1=d2;d2=t;
}
//这里计算中间年份的天数,比如2000.2.2-2003.2.3,这里计算2001和2002的天数,后面再计算2000.2.2到2001.1.1的天数和2003.1.1到2003.2.3的天数
for(i=y1+1;i<y2;i++)
{
if(leap(i)==1)
n=n+n1;
else
n=n+n2;
}
if(y1<y2)//如果不同年
{
//计算y1年m1月之后月份的天数,比如2000.2.2,就计算2000年3月到12月的天数
for(i=m1+1;i<=12;i++)
{
if(leap(y1)==1)
t1=t1+a[i-1];
else
t1=t1+b[i-1];
}
//计算y1年m1月d1日当月剩余的天数
if(leap(y1)==1)
t1=t1+a[m1-1]-d1;
else
t1=t1+b[m1-1]-d1;
//计算y2年1月1日到y2年m2月d2日的天数
for(i=1;i<m2;i++)
{
if(leap(y2)==1)
t1=t1+a[i-1];
else
t1=t1+b[i-1];
}
t1=t1+d2;
}
else//同一年
{
if(m1==m2)//同一年又同一月
{
t1=d2-d1;
}
else
{
//同一年不同月,先计算中间月份的天数
for(i=m1+1;i<m2;i++)
{
if(leap(y1)==1)
t1=t1+a[i-1];
else
t1=t1+b[i-1];
}
//计算m1月d1日当月剩余天数加上m2月d2日的天数
if(leap(y1)==1)
t1=t1+a[m1-1]-d1+d2;
else
t1=t1+b[m1-1]-d1+d2;
}
}
s=n+t1;
printf("%d年%d月%d日与%d年%d月%d日共有%d天 ",y1,m1,d1,y2,m2,d2,s);
}
㈨ c语言 用库函数计算两日期相差的天数
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
int main(void)
{
int isPrime(int year);
int dateDiff(struct date mindate,struct date maxdate);
struct date mindate,maxdate;
int days;
printf("please input the one date:");
scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
printf("please input other day:");
scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);
days=dateDiff(mindate,maxdate);
printf("the day is:%d\n",days);
return 0;
}
/************************************************************************/
/* 判断闰年函数(4年一润,100年不润,400年再润) */
/************************************************************************/
int isPrime(int year)
{
if ((year%4==0&&year%100!=0)||(year%400==0))
{
return 1;
}
else
{
return 0;
}
}
int dateDiff(struct date mindate,struct date maxdate)
{
int days=0, flag=1;
const int primeMonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
const int notPrimeMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/************************************************************************/
/* 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate */
/************************************************************************/
struct date tmp;
if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))
{
tmp=mindate;
mindate=maxdate;
maxdate=tmp;
}
int maxmonth,minmonth;
/************************************************************************/
/* 主要思路:拿2002-8-8 2005-2-22来说 */
/* 将2004-8-8---2005-2-22----2005-7-8 */
/*一前一后刚好N年,算出2005-2-22到2005-7-8的天数,然后用总年*36(5|6)减掉) */
/* 2002-9-8 2005-11-22 */
/* 2002-9-8-----2005-9-8-----2005-11-22(这次是加上后面天数) */
/*如何判断是加还是减呢?年大而月小的,则是减,程序中用flag标示 */
/************************************************************************/
if (maxdate.month<mindate.month)
{
maxmonth=mindate.month;
minmonth=maxdate.month;
flag=-1;
}
else
{
maxmonth=maxdate.month;
minmonth=mindate.month;
flag=1;
}
/************************************************************************/
/* 从mindate.year开始累加到maxdate.year */
/************************************************************************/
for(int j=mindate.year;j<maxdate.year;++j)
{
if (isPrime(j)==1)
{
days+=366;
}
else
days+=365;
}
/************************************************************************/
/* 从minmonth累加到maxmonth,分闰年和平年 */
/************************************************************************/
int day;
if(isPrime(maxdate.year)==1)
{
for(int i=minmonth;i<maxmonth;i++)
{
day=primeMonth[i-1]*flag;
days=days+day;
}
days=days+maxdate.day-mindate.day;
}
else
{
for (int i=minmonth;i<maxmonth;i++)
{
day=notPrimeMonth[i-1]*flag;
days=days+day;
}
days=days+maxdate.day-mindate.day;
}
return days;
}
㈩ c语言两日期相差天数
#include <stdio.h>
#include<math.h>
int main()
{
int s=0,m1,d1,y1,y2,m2,d2,i,a[12]={31,28,31,30,31,30,31,31,30,31,30,31},b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
scanf("%d %d %d",&y1,&m1,&d1);
scanf("%d %d %d",&y2,&m2,&d2);
if(y1==y2)
{
if((y1%100!=0&&y1%4==0)||y1%400==0)
{
while(m1<m2)
{s=b[m1-1]+s;
m1=m1+1;
}
}
else
{
while(m1<m2)
{s=a[m1-1]+s;
m1=m1+1;
}
}
printf("%d days\n",s+d2-d1);
}
else
{
while(y1<y2)
{
if(m1<=2)
{
if((y1%100!=0&&y1%4==0)||y1%400==0)
{s=366+s;}
else
{s=365+s;}
y1=y1+1;
}
else
{
y1=y1+1;
if((y1%100!=0&&y1%4==0)||y1%400==0)
{s=366+s;}
else
{s=365+s;}
}
}
if(m1<=m2)
{
if((y2%100!=0&&y2%4==0)||y2%400==0)
{for(i=0;m1<m2;i++)
{s=b[m1-1]+s;
m1=m1+1;
}
}
else
{for(i=0;m1<m2;i++)
{s=a[m1-1]+s;
m1=m1+1;
}
}
printf("%d days\n",s+d2-d1);
}
else
{
if((y2%100!=0&&y2%4==0)||y2%400==0)
{
while(m1>m2)
{s=b[m1-1]+s;
m1=m1-1;
}
}
else
{
while(m1>m2)
{s=a[m1-1]+s;
m1=m1-1;
}
}
printf("%d days\n",s+d2-d1);
}
}
return 0;
}
你试试看!