zoukankan      html  css  js  c++  java
  • 计算两个日期之间的天数(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;
    }
    

      

  • 相关阅读:
    【简报】一款使用静态图片生成动画的jQuery插件:JZoopraxiscope
    使用jQuery timelinr和animate.css创建超酷的CSS动画时间轴特效
    超酷信息图分享:你属于哪类geek?
    数据库操作优化
    android R.java aapt
    xml sax 解析 & 符号
    sql server2000 完全卸载
    cmd 命令总结
    手动打包 解释
    bat 执行 java jar包
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2351883.html
Copyright © 2011-2022 走看看