计算两个日期之间的天数(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; } |
分类:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架