C++計算任意兩個日期天數(shù)差的方法詳解
1.思路
這個問題有三種情況:同年同月、同年不同月、不同年。
同年同月非常容易,較難解決的是后兩個。
思路為下:
1.計算日期在前的一年到年底的天數(shù)
2.計算日期在后的一年到年初的天數(shù)
3.計算中間年份的天數(shù)
以上為解決不同年的思路。
同年不同月的思路整體差不多,也是計算前一個月到月底的天數(shù)、后一個月到月初的天數(shù)、中間月份的天數(shù)。
2.代碼實現(xiàn)
我建立了三個函數(shù):months1–計算到年底的天數(shù)差,months2–計算到年初的天數(shù)差,years1–計算兩年之間的天數(shù)差。還有一個就是閏年判斷函數(shù)lapeyear,用來判斷一年中的二月有沒有29天。
int months1(int year, int month, int date)//計算到年底日差的函數(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)//計算到年初日差的函數(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)//計算兩年間的天數(shù)
{
int d = 0, i, r = 0, z = 0;
if (year1 < year2)
{
for (i = year1 + 1; i < year2; i++)
{
if (lapeyear(i))r++;//兩年之間有多少個閏月
}
d = (year2 - year1 - 1) * 365 + r;
}
else
{
for (i = year2 + 1; i < year1; i++)
{
if (lapeyear(i))r++;//兩年之間有多少個閏月
}
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)//計算兩年間的天數(shù)
{
int d = 0, i, r = 0, z = 0;
if (year1 < year2)
{
for (i = year1 + 1; i < year2; i++)
{
if (lapeyear(i))r++;//兩年之間有多少個閏月
}
d = (year2 - year1 - 1) * 365 + r;
}
else
{
for (i = year2 + 1; i < year1; i++)
{
if (lapeyear(i))r++;//兩年之間有多少個閏月
}
d = (year1 - year2 - 1) * 365 + r;
}
return d;
}
int months2(int year, int month, int date)//計算到年初日差的函數(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)//計算到年底日差的函數(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;//記錄兩個日期分別到年初和年底的天數(shù)
int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
cout << "請輸入兩個日期" << endl;
cin >> year1 >> month1 >> date1 >> year2 >> month2 >> date2;
if (year1 == year2)//大前提,同年時
{
if (lapeyear(year1))years[1] = 29;
if (month1 == month2)d = date1 > date2 ? date1 - date2 : d = date2 - date1;//同年同月
if (month1 != month2)//同年不同月
{
//計算方法為求出兩月之前的天數(shù),然后求前一個月剩余的天數(shù)和后一個月已經(jīng)開始的天數(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++計算任意兩個日期天數(shù)差的方法詳解的文章就介紹到這了,更多相關(guān)C++計算日期天數(shù)差內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間)
這篇文章主要介紹了C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C++算法學(xué)習(xí)之分支限界法的應(yīng)用
分支限界法常以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。本文將詳細講解分支限界法的應(yīng)用,需要的可以參考一下2022-05-05

