C语言中 求两个日期间的天数
//代码错误是:printf写成了pritnf//代码考虑的不周全,如果输入的是同一年,那代码怎么计算,还有不同年计算也有大问题//你的代码思路看的我头大,干脆没看,在你的代码基础上直接给改了,供参考//这个代码中注释的应该很清楚,有疑问可以追问#include int leap(int year){if (year% 4 == 0 || year% 400 == 0 && year% 100 != 0)return 1;elsereturn 0;}int a[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };/*闰年月份天数*/int b[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };void main(){int t, s, i, t1 = 0, n = 0, n2 = 365, n1 = 366;/*s为总天数,n为年中间天数*/int y1, m1, d1;int y2, 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;elsen = 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];elset1 = t1 + b[i-1];}//计算y1年m1月d1日当月剩余的天数if (leap(y1) == 1)t1=t1+a[m1-1]-d1;elset1=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];elset1 = 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];elset1 = t1 + b[i-1];}//计算m1月d1日当月剩余天数加上m2月d2日的天数if (leap(y1) == 1)t1=t1+a[m1-1]-d1+d2;elset1=t1+b[m1-1]-d1+d2;}}s = n + t1;printf("%d年%d月%d日与%d年%d月%d日共有%d天
", y1, m1, d1, y2, m2, d2, s);}
问题不难。
思路如下:
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)这个函数就可计算出两个日期之间的天数.
至于日期的合法性,没有进行判断;也就是说,你如果输入一个不合法的日期,计算出来的结果是不正确的;如果是合法日期,那就没问题。
*/
要把年、月、日分开来求...
#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;
}
不记得有类似的库函数,应该相减就能出结果。如果返回值不是 int 型就加个强制类型转换,应该很容易。
呵呵,我记错了。抱歉。C 语言没有日期变量。
这样的话,就八仙过海,各显其能了。楼下已经给出不少代码了,我就不现丑了。
霍庭罗浮: #include <stdio.h> #include <time.h> #include <memory.h>int main(void) { time_t t1; time_t t2;struct tm OldTime; struct tm NewTime;memset(&OldTime,0x0,sizeof(tm)); OldTime.tm_year = 110;// 2010 年表示为 2010 - 1900 = 110 OldTime.tm_...
尖草坪区15212457905: 给定年月日 怎样用C语言编程计算2个日期之间的时间天数 - ?
霍庭罗浮: 问题不难. 思路如下: 1. 要判断时间的合法性(如果不想判断也可以) 参考资料:(使用的是C++,修改之后TC下也可运行,主要是看思路) http://hi.baidu.com/ctralt/blog/item/ee937c167e87db4b21a4e96b.html2. 判断两个日期之间的天数 ...
尖草坪区15212457905: C语言计算两日期间的天数 - ?
霍庭罗浮: //用中的 time_t 和 struct tm 结构体, difftime() 函数#include #include #include #include time_t maketime_t(char* date1) { struct tm tm0; char str0[4];//date1 memset( &tm0, 0, sizeof(tm0)); memset( str0, 0, 4); strncpy(str0, date1, 4); tm0.tm_year = ...
尖草坪区15212457905: 【求助】关于c语言设计求两个日期之间相差的天数?
霍庭罗浮: #include int main(void){int ri, yue, nian = 0;scanf("%d%d%d", &nian, &yue, &ri);int ris, yues, nians = 0;scanf("%d%d%d", &ris, &yues, &nians);printf("%d-%d-%d", nian-nians, yue-yues,ri-ris);return 0;}
尖草坪区15212457905: 如何用c语言来计算日期间隔天数? - ?
霍庭罗浮: 傻瓜式做法:先做一个变量赋全年多少天 再做12个变量代表12个月,再赋每月多少天 然后就可以计算两个日期之间的相隔天数 怎么做不用教了吧
尖草坪区15212457905: 求一C语言程序,计算给定的两日期之间的天数,用时间函数做,日期为结构体,急求! - ?
霍庭罗浮: 1、首先判断输入日期的合法性,自定义日期格式 yyyy-mm-dd yyyy.mm.dd 如何定义,就如何判断.2、根据年判断出,是平年还是闰年,也就知道了当年2月份的天数.3、计算出两个日期间的天数.
尖草坪区15212457905: C语言编程 求高手 题目:任意输入两个日期,计算两个日期之间的天数 - ?
霍庭罗浮: 使用一个2行12列的数组,分闰年与否记录各个月份的天数,然后后边的就简单了
尖草坪区15212457905: c语言 用库函数计算两日期相差的天数 - ?
霍庭罗浮: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h>intget_days(...
尖草坪区15212457905: 本人想写一个C语言,实现“计算两个不同年月日的天数差”功能. - ?
霍庭罗浮: #include#include int main(){ int year2,year1;//定义变量int month1,month2;//定义变量int day1,day2;//定义变量printf("请输入两个年月日"); scanf("%d%d%d%d%d%d",&year1,&month1,&day1,&year2,&month2,&day2);//输入数...
尖草坪区15212457905: 用c语言编写一个能计算两个日期之间相差多少天!(不跨年) 说一下计算思路,用if语句最好附上源码. - ?
霍庭罗浮: #define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400)) static const unsigned short rtc_ydays[2][13] = { /* Normal years */ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, /* Leap years */ { 0, 31, 60, 91, 121, 152, 182,...