計算兩個日期之間的天數(C++)


//歷法規定,四年一閏,四百年閏,例如2000年是閏年,2100年不閏年,
//公歷年份是整百數的,必須是400的倍數的才是閏年,不是400的倍數的就是平年
//計算兩個日期之間的天數(C++)
//定義變量year1, month1, day1, year2, month2, day2
//取出2個日期中的年 月 日
//如果年相同,月也相同
//return day1- day2
/*
問題: 給你兩個日期(如"2010-04-13"和"1988-10-24"),求它們之間相差的天數
分析: 這是一年看似簡單,實際上卻有點復雜的小問題,首先你要考慮到月大月小的問題,其次你要考慮到閏年的問題
當然,你也要檢測一下,給定的日期格式是否合法,對這個問題的解法,寫出偽代碼如下

定義變量year1, month1, day1, year2, month2, day2
取出2個日期中的 年 月 日
如果年相同,月也相同:
Return | day1 - day2
如果年相同,月不同:
D1 = date1是該年的第幾天
D2 = date2是該年的第幾天
Return | d1 - d2
如果年份不同:
D1 = 年份小的日期,離年低還有多少天
D2 = 年份大的日期是這年的第幾天
D3 = 兩個日期之間相差多少個整年,共有多少天
Return D1 + D2 + D3
上面的偽代碼用戶C++實現如下:
*/

 

#include <iostream>
using namespace std;
//IsLeap函數判斷一個年份是否為閏年,方法如下:
bool IsLeap(int year)
{
   return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);
}

//上面的StringToDate函數用於取出日期中的年月日並判斷日期是否合法
//從字符中最得年月日 規定日期的格式是yyyy-mm-dd
bool StringToDate(string date, int& year, int& month, int& day)
{
	year = atoi((date.substr(0,4)).c_str());
	month = atoi((date.substr(5,2)).c_str());
	day = atoi((date.substr(8,2)).c_str());
	int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(IsLeap(year)){
	     DAY[1] = 29;
	}
	return year >= 0 && month<=12 && month>0 && day<=DAY[month] && day>0;
}

//DayInYear能根據給定的日期,求出它在該年的第幾天,代碼如下
int DayInYear(int year, int month, int day)
{
	//int _day = 0;
    int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(IsLeap(year))
		DAY[1] = 29;
	for(int i=0; i<month - 1; ++i)
	{
	    day += DAY[i];
	}
	return day;
}

int DaysBetween2Date(string date1, string date2)
{
     //取出日期中的年月日
	 int year1, month1, day1;
	 int year2, month2, day2;
	 if(!StringToDate(date1, year1, month1, day1) || !StringToDate(date2, year2,month2,day2))
	 {
	    cout<<"輸入的日期格式不正確";
		return -1;
	 }
	 if(year1 == year2 && month1 == month2)
	 {
	      return day1 > day2 ? day1 - day2 : day2 - day1;
	 
	 //如果年相同
	 }else if(year1 == year2)
	 {
	     int d1, d2;
		 d1 = DayInYear(year1, month1, day1);
		 d2 = DayInYear(year2, month2, day2);
		 return d1 > d2 ? d1 - d2 : d2 - d1;
	 
	 //年月都不相同
	 }else{
	     //確保year1年份比year2早
		 if(year1 > year2)
		 {
			 //swap進行兩個值的交換
		     swap(year1, year2);
			 swap(month1, month2);
			 swap(day1, day2);
		 }
		 int d1,d2,d3;
		 if(IsLeap(year1))
			 d1 = 366 - DayInYear(year1,month1, day1); //取得這個日期在該年還於下多少天
		 else
			 d1 = 365 - DayInYear(year1,month1, day1);
         d2 = DayInYear(year2,month2,day2); //取得在當年中的第幾天
		 cout<<"d1:"<<d1<<", d2:"<<d2;
		 
		 d3 = 0;
		 for(int year = year1 + 1; year < year2; year++)
		 {
		     if(IsLeap(year))
				 d3 += 366;
			 else
				 d3 += 365;
		 }
		 return d1 + d2 + d3;
	 }
}
int main()
{
	int a = DaysBetween2Date("2010-11-11","2011-11-11");
	cout<<"2010-11-11到2011-11-11相差 "<<a<<" 天";
    system("pause");
	return 0;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM