计算两个日期相差天数的最简洁的代码
国际惯例,转载注明出处。大飞机: https://user.qzone.qq.com/16491848/blog/1551429397?source=namecardword
1 static void Main(string[] args) 2 { 3 Console.WriteLine(CountDays(2019, 3, 3) - CountDays(1949, 10, 1)); 4 Console.ReadKey(); 5 } 6 7 static int CountDays(int y, int m, int d) 8 { 9 if (m < 3) 10 { 11 y--; 12 m += 12; 13 } 14 return 365 * y + (y >> 2) - y / 100 + y / 400 + (153 * m - 457) / 5 + d - 306; 15 }
而求总天数的代码就是这个算法的核心,只有两行。我现在详细说说这个算法的原理:
计算日期差的算法,无论什么算法(除了故意浪费时间的算法),时间复杂度都是 O(1),这个没什么好说的。关键在于优化计算步骤。
日期差计算有两个难点:
1. 怎样解决闰年的 2 月天数问题
2. 怎样解决不同月份的天数不同问题(常规算法是使用数组记录每个月的天数)
为了解决这两个问题,该算法先把 1 月和 2 月当成上一年的 13 月和 14 月。然后,我们看一下每个月的天数:
月份:03-04-05-06-07;08-09-10-11-12;13-14
天数:31-30-31-30-31;31-30-31-30-31;31-30(28)
为了凸显规律,我将 5 个月分成了一组。
可以看到,将 1、2 月挪动后,月份与天数的规律就出来了:
5 个月一组,1-0-1-0-1,重复(先减去 30,好看清楚)。
在这个规律的基础上,为了后续计算的方便,先求出 m 月之前有多少天(以 3 月为第一个月),得到这样的序列(先减去 30,好看清楚):
0-1-1-2-2,3-4-4-5-5,6-7
比如说第 6 个数字 3,对应的是 8 月,表示 8 月之前一共有 3 + 30 * 5 = 153 天。(30 * 5,表示加上 3~7 月每月 30 天)
于是,找到这样的表达式(注意:C 语言整数相除的结果直接取整,并不做四舍五入):
(m * 3 - 7) / 5
可以得出前面提到的:
0-1-1-2-2,3-4-4-5-5,6-7
这样的规律序列。
再把每月 30 天加进去,得出表达式:
(153 * m - 457) / 5
该表达式求出 m 月之前一共有多少天。
例:
m = 3 时,3 月是第一个月,所以表达式值为 0;
m = 4 时,表达式值为 31,就是 3 月的总天数;
m = 7 时,表达式值为 3 ~ 6 月的总天数。
因为把闰月挪到了最后一个月,所以 m = 14 时(就是表示 2 月),计算结果只是 3 ~ 13 月的总天数,并不会受闰月影响。
以上,就是算法最难理解的一部分。
其他代码都简单了,
+ (y >> 2) - y / 100 + y / 400
是直接加上期间有多少闰年。y>>2 是 y / 4 等效的位移运算写法(效率更高)。
就是这么简单~
上面是转载内容。这里面有个难点,就是(m * 3 - 7) / 5这个公式是怎么来的。
其实,只要意识到,每个区间的第一个数是等差数列,是可以直接快速算出这个特定公式的
转载于:https://www.cnblogs.com/Pupa/p/10467523.html
计算两个日期相差天数的最简洁的代码相关推荐
- python判断天数_Python计算两个日期相差天数的方法示例
本文实例讲述了Python计算两个日期相差天数的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python import time import sys def dateinput() ...
- 使用Calendar 计算两个日期相差天数,
1.代码: public static void main(String[] args) throws ParseException {SimpleDateFormat sdf = new Simpl ...
- MySQL计算两个日期相差天数
日常开发中使用mysql数据库,一定会用到的操作就是时间相关的比较. 经常会有查询今天.昨天.前七天.前30天等查询条件. 简单且准确的时间计算希望能帮到你 MySQL 计算两个日期之间的天数 TO_ ...
- JavaScript计算两个日期相差天数/分钟/小时
/*** 日期相减获取天数(用于公式计算)* @param date1 日期一 例如:"{'value':'2020-06-05','date_format':'yyyy-MM-dd'}&q ...
- kotlin 计算两个日期相差天数
如何计算两个yyyyMMdd格式的data之间的日期天数 最近在开发一个日志库的时候遇到一个时间计算问题. 需求是这样的,日志文件夹XXX/yyyyMMdd/xxx.log,我想开发一个日志有效期时间 ...
- LocalDate 计算两个日期相差天数
1.同月相差天数,月份,年份 LocalDate start = LocalDate.of(2021,5,1);LocalDate end = LocalDate.now();Period next ...
- Python计算两个日期相差的天数
有时候需要算两个日期相差多少天,如果两个日期相差大,真的去数肯定很麻烦,还得计算有的是有三十天,有的是三十一天,还有闰年和平年的区别.而这时候如果有一个方法或者函数,只需要输入要计算的两个日期即可,那 ...
- 【时间处理】Python 计算两个日期相差的天数
有时候需要算两个日期相差多少天,如果两个日期相差大,真的去数肯定很麻烦,还得计算有的是有三十天,有的是三十一天,还有闰年和平年的区别.而这时候如果有一个方法或者函数,只需要输入要计算的两个日期即可,那 ...
- 计算两个日期相差的天数
JavaBean类 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calen ...
最新文章
- 电脑有回声_游戏东西丨兽人游戏Echo回声电脑手机汉化版
- [RDLC]报表根据字段列动态加载图片(二)
- 项目、SVN clean的一些事
- 网狐棋牌(八) 异步引擎 和 网狐棋牌(九) 服务引擎概览
- 字符串不替代_TI-Nspire 系列的字符串操作
- Java国际化资源绑定-----示例
- Mysql学习总结(6)——MySql之ALTER命令用法详细解读
- 深度学习笔记 | 第16讲:语音识别——一份简短的技术综述
- 数据建模软件Chiner,颜值与实用性并存
- lammps软件介绍与使用
- 封装、继承、多态的详细说明
- 流传千古的爱情传说原来竟是一个先劫色后劫财的骗局
- 09年国内外免费杀毒软件大收罗
- android bks证书生成方式
- 【腾讯BUG】QQ群贴超大表情BUG,恶意炸群BUG
- C++11之正则表达式(regex_match、regex_search、regex_replace)
- 最新的Fresco加载Gif图片
- Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园
- 常用Linux的ssh远程终端连接工具
- linux 计价软件,开源实时计费系统 asterCC
热门文章
- Fence Repair (poj3253)
- 虚拟世界来自现实世界,同时又促进现实世界
- Ajax提交数据判断员工编号是否存在,及自动填充与员工编号所对应的员工姓名。...
- 《redis-php中文参考手册》-php版
- ARM 指令集跳转指令
- XP 装 sql 2008 允许远程连接
- Mac. IntelliJ IDEA maven+springmvc添加包时小插曲
- 计算机网络学习笔记(14. OSI参考模型②)
- JavaScript学习(四十)—字面量创建对象图解
- android 按钮点击动画效果_如何用纯css打造类materialUI的按钮点击动画并封装成react组件...