當前位置:首頁 » 編程語言 » c語言計算兩個日期之間的天數

c語言計算兩個日期之間的天數

發布時間: 2025-04-16 09:36:04

『壹』 如何用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語言編程計算2個日期之間的時間天數

1970 年以後的時間,可以用 time.h 里的函數計算。時間精度為秒。按題目要求,輸出時間單位用天。程序如下:
#include <stdio.h>
#include <time.h>
time_t YMD_hhmmss_2_s70(int Y, int M, int D, int hh, int mm, int ss){
struct tm *target_tm;
time_t tt;
time (&tt);
target_tm=localtime(&tt);
target_tm->tm_year = Y - 1900;
target_tm->tm_mon= M - 1;
target_tm->tm_mday = D;
target_tm->tm_hour = hh; // hour
target_tm->tm_min = mm;
target_tm->tm_sec = ss;
tt = mktime(target_tm); // from tm to time_t (s)
return tt;
}
int main()
{
int y1,m1,d1,y2,m2,d2;
time_t t1,t2;
int dt;
printf("input y1 m1 d1: ");
scanf("%d %d %d",&y1,&m1,&d1);
printf("\ninput y2 m2 d2: ");
scanf("%d %d %d",&y2,&m2,&d2);
t1 = YMD_hhmmss_2_s70(y1,m1,d1,0,0,0);
t2 = YMD_hhmmss_2_s70(y2,m2,d2,0,0,0);
dt = (t2-t1)/(24*3600);
printf("\ndt=%d\n",dt);
return 0;
}
這里未包含日期的合法性判斷。
1970 年以前 要另寫程序。某年的日子是當年的第幾天可用下面函數得出:
int YMD_2_JD(int Y, int M, int D){
const short MonthDay[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int JD,i;
JD=D;
for (i=0;i<M;i++) JD+=MonthDay[i];
if (((Y%4==0)&&(Y%100!=0)||(Y%400==0)) && (M>2)) JD++;
return JD;
}
整年的天數,涉及閏年的判斷:
某年是否閏年,用 (Y%4==0)&&(Y%100!=0)||(Y%400==0) 判斷。閏年366天,平年365天。 有了這些,寫程序不難。
未考慮公元前的年月日計算。

『叄』 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語言求任意兩個日期間的天數,有代碼但報錯

//代碼錯誤是: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);
}

熱點內容
壓縮瓦片 發布:2025-04-16 15:22:13 瀏覽:870
紅旗hs7哪個配置適合家用 發布:2025-04-16 15:04:17 瀏覽:410
win7php7 發布:2025-04-16 14:55:28 瀏覽:374
無向圖java 發布:2025-04-16 14:53:39 瀏覽:139
openwrt編譯出錯 發布:2025-04-16 14:52:48 瀏覽:444
手機正常通話受訪問控制限制 發布:2025-04-16 14:47:50 瀏覽:511
android錄制mp4 發布:2025-04-16 14:42:03 瀏覽:133
phpdevel 發布:2025-04-16 14:41:53 瀏覽:712
游迅網模擬人生4不能解壓 發布:2025-04-16 14:32:16 瀏覽:722
愛奇藝會上傳 發布:2025-04-16 14:31:36 瀏覽:817