博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法集中营】计算两个日期之间的天数
阅读量:4682 次
发布时间:2019-06-09

本文共 2611 字,大约阅读时间需要 8 分钟。

/历法规定,四年一闰,四百年闰,例如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;
}

转载于:https://www.cnblogs.com/huty/p/8518676.html

你可能感兴趣的文章
[.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
查看>>
get 和 post
查看>>
我该如何奋斗?
查看>>
java的RandomAccessFile类
查看>>
在ASP.NET MVC中使用DropDownList
查看>>
在一个类里面调用别一个类的函数
查看>>
树状数组
查看>>
echarts演示笔记
查看>>
词法分析的源代码与运行结果
查看>>
3.2课堂讨论-Beta版总结会议
查看>>
Java的Cloneable接口还有深浅复制
查看>>
5 从尾到头打印链表
查看>>
程序员为什么要高薪?看完让你勇于为自己开价
查看>>
letecode [108] - Convert Sorted Array to Binary Search Tree
查看>>
list 导出为excel
查看>>
Win32多线程之核心对象
查看>>
mysql简单操作(实时更新)
查看>>
vue
查看>>
Javascript中Array(数组)对象常用的几个方法
查看>>
C/C++培训资料整理
查看>>