C++計(jì)算任意兩個(gè)日期天數(shù)差的方法詳解
1.思路
這個(gè)問(wèn)題有三種情況:同年同月、同年不同月、不同年。
同年同月非常容易,較難解決的是后兩個(gè)。
思路為下:
1.計(jì)算日期在前的一年到年底的天數(shù)
2.計(jì)算日期在后的一年到年初的天數(shù)
3.計(jì)算中間年份的天數(shù)
以上為解決不同年的思路。
同年不同月的思路整體差不多,也是計(jì)算前一個(gè)月到月底的天數(shù)、后一個(gè)月到月初的天數(shù)、中間月份的天數(shù)。
2.代碼實(shí)現(xiàn)
我建立了三個(gè)函數(shù):months1–計(jì)算到年底的天數(shù)差,months2–計(jì)算到年初的天數(shù)差,years1–計(jì)算兩年之間的天數(shù)差。還有一個(gè)就是閏年判斷函數(shù)lapeyear,用來(lái)判斷一年中的二月有沒(méi)有29天。
int months1(int year, int month, int date)//計(jì)算到年底日差的函數(shù) { int i, d = 0; int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (lapeyear(year))years[1] = 29; for (i = 11; i > month - 1; i--) { d += years[i]; } d = d + years[month - 1] - date; return d; }
int months2(int year, int month, int date)//計(jì)算到年初日差的函數(shù) { int i, d = 0; int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (lapeyear(year))years[1] = 29; for (i = 0; i < month - 1; i++) { d += years[i]; } d += date; return d; }
int years1(int year1, int year2)//計(jì)算兩年間的天數(shù) { int d = 0, i, r = 0, z = 0; if (year1 < year2) { for (i = year1 + 1; i < year2; i++) { if (lapeyear(i))r++;//兩年之間有多少個(gè)閏月 } d = (year2 - year1 - 1) * 365 + r; } else { for (i = year2 + 1; i < year1; i++) { if (lapeyear(i))r++;//兩年之間有多少個(gè)閏月 } d = (year1 - year2 - 1) * 365 + r; } return d; }
3.完整代碼
以下為全部的代碼
#include<iostream> using namespace std; int lapeyear(int year2)//閏年判斷函數(shù) { if ((year2 % 400 == 0) || (year2 % 4 == 0 && year2 % 100 != 0)) return 1; else return 0; } int years1(int year1, int year2)//計(jì)算兩年間的天數(shù) { int d = 0, i, r = 0, z = 0; if (year1 < year2) { for (i = year1 + 1; i < year2; i++) { if (lapeyear(i))r++;//兩年之間有多少個(gè)閏月 } d = (year2 - year1 - 1) * 365 + r; } else { for (i = year2 + 1; i < year1; i++) { if (lapeyear(i))r++;//兩年之間有多少個(gè)閏月 } d = (year1 - year2 - 1) * 365 + r; } return d; } int months2(int year, int month, int date)//計(jì)算到年初日差的函數(shù) { int i, d = 0; int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (lapeyear(year))years[1] = 29; for (i = 0; i < month - 1; i++) { d += years[i]; } d += date; return d; } int months1(int year, int month, int date)//計(jì)算到年底日差的函數(shù) { int i, d = 0; int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (lapeyear(year))years[1] = 29; for (i = 11; i > month - 1; i--) { d += years[i]; } d = d + years[month - 1] - date; return d; } int main() { int year1, year2, month1, month2, date1, date2; int d = 0, i, m = 0; int x1, x2;//記錄兩個(gè)日期分別到年初和年底的天數(shù) int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; cout << "請(qǐng)輸入兩個(gè)日期" << endl; cin >> year1 >> month1 >> date1 >> year2 >> month2 >> date2; if (year1 == year2)//大前提,同年時(shí) { if (lapeyear(year1))years[1] = 29; if (month1 == month2)d = date1 > date2 ? date1 - date2 : d = date2 - date1;//同年同月 if (month1 != month2)//同年不同月 { //計(jì)算方法為求出兩月之前的天數(shù),然后求前一個(gè)月剩余的天數(shù)和后一個(gè)月已經(jīng)開(kāi)始的天數(shù) if (month1 < month2) { { for (i = month1; i < month2 - 1; i++) { m += years[i]; } } d = years[month1 - 1] - date1; d += m + date2; } else { for (i = month2; i > month1 - 1; i++) { m += years[i]; } d = years[month2 - 1] - date2; d += m + date1; } } } else//求不同年的任意日期的天數(shù)差 { if (year1 > year2) { x1 = months1(year2, month2, date2);//x1為到年底的日差,x2為到年初的日差 x2 = months2(year1, month1, date1); d = years1(year2, year1); d += x1 + x2; } else { x2 = months2(year2, month2, date2); x1 = months1(year1, month1, date1); d = years1(year1, year2); d += x1 + x2; } } cout << "兩年之間的天數(shù)差為" << " " << d; return 0; }
到此這篇關(guān)于C++計(jì)算任意兩個(gè)日期天數(shù)差的方法詳解的文章就介紹到這了,更多相關(guān)C++計(jì)算日期天數(shù)差內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
字符串的組合算法問(wèn)題的C語(yǔ)言實(shí)現(xiàn)攻略
這篇文章主要介紹了字符串的組合算法問(wèn)題的C語(yǔ)言實(shí)現(xiàn)攻略,是根據(jù)ACM總結(jié)的經(jīng)典算法問(wèn)題,需要的朋友可以參考下2015-08-08C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用
本篇文章主要包括內(nèi)聯(lián)函數(shù)和auto關(guān)鍵字。其中,內(nèi)斂函數(shù)包括概念,特性等;auto關(guān)鍵字的使用規(guī)則,使用場(chǎng)景等,接下來(lái)讓我們深入了解2022-05-05C# CLR 中學(xué)習(xí) C++關(guān)鍵詞extern使用詳解
這篇文章主要為大家介紹了C# CLR 中學(xué)習(xí) C++ 之extern使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09二分法求多項(xiàng)式在-10 10間值的實(shí)現(xiàn)代碼
以下實(shí)例是介紹了二分法求多項(xiàng)式在-10 10間值的實(shí)現(xiàn)代碼。需要的朋友參考下2013-05-05C語(yǔ)言數(shù)據(jù)類型枚舉enum全面詳解示例教程
生活中有很多地方會(huì)用到枚舉,比如一周有7天,可以一一枚舉;性別有男、女...等等都可以可以一一枚舉,今天來(lái)和筆者一起學(xué)習(xí)一下c語(yǔ)言枚舉吧2021-10-10C語(yǔ)言實(shí)現(xiàn)電子時(shí)鐘程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電子時(shí)鐘程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11C語(yǔ)言入門學(xué)習(xí)筆記之typedef簡(jiǎn)介
typedef為C語(yǔ)言的關(guān)鍵字,作用是為一種數(shù)據(jù)類型定義一個(gè)新名字,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言入門學(xué)習(xí)筆記之typedef簡(jiǎn)介的相關(guān)資料,需要的朋友可以參考下2021-11-11C++類與對(duì)象深入之構(gòu)造函數(shù)與析構(gòu)函數(shù)詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對(duì)我們對(duì)C++非常重要的一個(gè)知識(shí)點(diǎn)做出總結(jié),整理出來(lái)一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步2022-06-06C++進(jìn)程共享數(shù)據(jù)封裝成類實(shí)例
這篇文章主要介紹了C++進(jìn)程共享數(shù)據(jù)封裝成類的方法,以實(shí)例形式講述了其封裝代碼與具體用法,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10