算法笔记之旅 | 日期之间天数计算
目录
- 计算两个日期中间的天数
- 计算逻辑
- 处理闰年以及年月天数情况
- 处理正常逻辑
- 年月一致
- 年一致,月不一致
- 年月都不一致
- 代码实现
计算两个日期中间的天数
日常刷题碰到的,有计算两个日期之间天数的,有计算两个日期工作日数目的。这一类题目逻辑上算不上太难。只是没碰到过的话,第一时间可能想不好怎么处理。这里贴出来一条计算方法。
计算逻辑
打个比方是2020.3.15-2020.5.5中间一共多少天?
首先是处理闰年,这是死方法,处理天数也是。
处理闰年以及年月天数情况
以下数组第一维用来判断是否是闰年
int monthdays[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } }; //非闰年,2月28天,闰年2月29天int yeardays[2] = { 365,366 }; //非闰年365天,闰年366天int isLearyear(int year) //判断闰年
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;elsereturn 0;
}
处理正常逻辑
年月一致
直接计算天数差别
if (year1 == year2 && month1 == month2) //假如年月一致{sumdays = day2 - day1;}
年一致,月不一致
比如3月5日到5月15日,我们可以先计算3月还剩余天数,然后计算其中整个的月的天数,再加上最后一个5月的15天。
if (year1 == year2) //年份一样,月份不一致 2020.3.15 -2020.5.5 应该是51天
{sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期的当月剩余天数 3月剩余16天for (int i = month1; i < month2-1; i++) //从第一个日期当月的第二个月开始计算剩余整月的天数 4月1日开始到5月1日 30天{sumdays += monthdays[isLearyear(year1)][i];}sumdays += day2; //5月天数 5.1-5.5 一共5天
}
年月都不一致
- 首先处理第一个日期当月到年底的整月的天数
- 计算两个日期中间整年天数
- 再加上第二个日期最后的整月的天数
- 最后加上第二个日期当月天数
sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期当月剩余天数for (int i = month1; i < 12; i++) //第一个日期整月天数sumdays += monthdays[isLearyear(year1)][i];for (int i = year1 + 1; i < year2; i++) //两个日期中间整年天数sumdays += yeardays[isLearyear(i)];for (int i = 0; i < month2 - 1; i++) //第二个日期整月天数sumdays += monthdays[isLearyear(year2)][i];sumdays += day2; //第二个日期当月天数
代码实现
#include<bits/stdc++.h>
using namespace std;int monthdays[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } }; //非闰年,2月28天,闰年2月29天int yeardays[2] = { 365,366 }; //非闰年365天,闰年366天int isLearyear(int year) //判断闰年
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;elsereturn 0;
}int caldays(int year1, int month1, int day1, int year2, int month2, int day2)
{int sumdays = 0;if (year1 == year2 && month1 == month2) //假如年月一致{sumdays = day2 - day1;}else{if (year1 == year2) //年份一样,月份不一致 2020.3.15 -2020.5.5 应该是51天{sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期的当月剩余天数 3月剩余16天for (int i = month1; i < month2-1; i++) //从第一个日期当月的第二个月开始计算剩余整月的天数 4月1日开始到5月1日 30天sumdays += monthdays[isLearyear(year1)][i];sumdays += day2; //5月天数 5.1-5.5 一共5天}else //年月都不一样{sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期当月剩余天数for (int i = month1; i < 12; i++) //第一个日期整月天数sumdays += monthdays[isLearyear(year1)][i];for (int i = year1 + 1; i < year2; i++) //两个日期中间整年天数sumdays += yeardays[isLearyear(i)];for (int i = 0; i < month2 - 1; i++) //第二个日期整月天数sumdays += monthdays[isLearyear(year2)][i];sumdays += day2; //第二个日期当月天数}}return sumdays;
}int main()
{int year1, month1, day1, year2, month2, day2;cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2;int days = caldays(year1, month1, day1, year2, month2, day2);cout << days << endl;return 0;
}
效果如下:
算法笔记之旅 | 日期之间天数计算相关推荐
- Layui日期选择器+两个日期之间天数计算
Layui日期选择器+天数计算 下面这个图片就是我们Layui双控组件的日期范围选择器,可以选择起始时间和终止时间,那么针对于这个组件我们该怎么获取它的具体天数呢? 首先:我的需求是是要年-月-日的格 ...
- 日期转天数的程序c语言,两个日期之间天数的计算C语言程序
<两个日期之间天数的计算C语言程序>由会员分享,可在线阅读,更多相关<两个日期之间天数的计算C语言程序(5页珍藏版)>请在人人文库网上搜索. 1.两个日期之间天数的计算 C 语 ...
- java计算两个日期之间天数
java计算两个日期之间天数 jxts = DateFunction.getNumberOfDays(jxErq, qsjxrq); public static long getNumberOfDay ...
- java 根据日期获取天数,java获取日期之间天数的方法
java获取日期之间天数的方法 本文实例讲述了java获取日期之间天数的方法.分享给大家供大家参考.具体实现方法如下: private int daysBetween(Date now, Date r ...
- python计算两个日期的天数计算多少岁
计算出生日期天数,计算两个日期之间天数,计算多少岁,获取两个日期之间的日期列表 安装datedays: pip install datedays import datedaysif __name__ ...
- java 根据日期获取天数_java获取日期之间天数的方法
//获取两个日期之间的天数 private int daysBetween(Date now, Date returnDate) { Calendar cNow = Calendar.getInsta ...
- js 日期 加天数计算
js 日期 加天数计算 AddDate=(date, days)=> {//日期计算if (!days) {days = 1;}var date = new Date(date);date.se ...
- php做一个计算日期之间天数,PHP计算任意两个日期之间的天数
PHP面试题中,关于日期的题目作为基础考题经常出现,下面讨论一下获取两个日期之间的天数的方法. 收到一个答案,拆分年.月.日,分别进行减法,然后统计天数,好累. 针对低版本的PHP可以用下面的方式搞定 ...
- Python 计算两个日期之间天数
关注RPA请访问网站: www.i-search.com.cn 学Python,用RPA,欢迎下载使用 www.i-search.com.cn/index.html?from=line1 有的时候要统 ...
最新文章
- TCP的三次握手和四次分手
- 【虚拟机】虚拟机(Vmware)怎么进入BIOS
- 【Django】模型层说明
- SpringBoot项目启动时:Failed to initialize connector [Connector[HTTP/1.1-8080]]
- inittab脚本启动解析 (zz)
- 流体式布局与响应式布局_将固定像素设计转换为流体比例布局
- flex java 全局拦截_Flex CSS阻止底层内容
- android dao设计模式,DAO设计模式
- 树链剖分边权模板spoj375
- Node.js视频教程
- 新益华基层医疗系统使用方法_MongoDB for VS Code:使用Mongo的新方法
- ubuntu下载软件创建桌面快捷方式
- 漫谈CRM体系化建设3:如何留住客户
- 清华EMBA课程系列思考之一 -- Techmark课程带给管理者的思考
- 微商个人相册多端小程序源码
- 清华计算机系与姚班,清华“姚班”,计算机专业学子们无比向往的班级
- VMware 安装Mac os 10.11 苹果系统
- LBS的概念、历史、现状与未来(一)
- 稀里糊涂地被评为博客之星的候选人了,那就麻烦大家帮忙投个票吧~
- 02-k8s资源管理与实战入门