国际惯例,转载注明出处。大飞机: 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 }

该算法先根据年月日求出该日期距离 0001年1月1日 的总天数,然后两个天数直接相减,即可求出日期差。

而求总天数的代码就是这个算法的核心,只有两行。我现在详细说说这个算法的原理:

计算日期差的算法,无论什么算法(除了故意浪费时间的算法),时间复杂度都是 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

计算两个日期相差天数的最简洁的代码相关推荐

  1. python判断天数_Python计算两个日期相差天数的方法示例

    本文实例讲述了Python计算两个日期相差天数的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python import time import sys def dateinput() ...

  2. 使用Calendar 计算两个日期相差天数,

    1.代码: public static void main(String[] args) throws ParseException {SimpleDateFormat sdf = new Simpl ...

  3. MySQL计算两个日期相差天数

    日常开发中使用mysql数据库,一定会用到的操作就是时间相关的比较. 经常会有查询今天.昨天.前七天.前30天等查询条件. 简单且准确的时间计算希望能帮到你 MySQL 计算两个日期之间的天数 TO_ ...

  4. JavaScript计算两个日期相差天数/分钟/小时

    /*** 日期相减获取天数(用于公式计算)* @param date1 日期一 例如:"{'value':'2020-06-05','date_format':'yyyy-MM-dd'}&q ...

  5. kotlin 计算两个日期相差天数

    如何计算两个yyyyMMdd格式的data之间的日期天数 最近在开发一个日志库的时候遇到一个时间计算问题. 需求是这样的,日志文件夹XXX/yyyyMMdd/xxx.log,我想开发一个日志有效期时间 ...

  6. LocalDate 计算两个日期相差天数

    1.同月相差天数,月份,年份 LocalDate start = LocalDate.of(2021,5,1);LocalDate end = LocalDate.now();Period next ...

  7. Python计算两个日期相差的天数

    有时候需要算两个日期相差多少天,如果两个日期相差大,真的去数肯定很麻烦,还得计算有的是有三十天,有的是三十一天,还有闰年和平年的区别.而这时候如果有一个方法或者函数,只需要输入要计算的两个日期即可,那 ...

  8. 【时间处理】Python 计算两个日期相差的天数

    有时候需要算两个日期相差多少天,如果两个日期相差大,真的去数肯定很麻烦,还得计算有的是有三十天,有的是三十一天,还有闰年和平年的区别.而这时候如果有一个方法或者函数,只需要输入要计算的两个日期即可,那 ...

  9. 计算两个日期相差的天数

    JavaBean类 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calen ...

最新文章

  1. 电脑有回声_游戏东西丨兽人游戏Echo回声电脑手机汉化版
  2. [RDLC]报表根据字段列动态加载图片(二)
  3. 项目、SVN clean的一些事
  4. 网狐棋牌(八) 异步引擎 和 网狐棋牌(九) 服务引擎概览
  5. 字符串不替代_TI-Nspire 系列的字符串操作
  6. Java国际化资源绑定-----示例
  7. Mysql学习总结(6)——MySql之ALTER命令用法详细解读
  8. 深度学习笔记 | 第16讲:语音识别——一份简短的技术综述
  9. 数据建模软件Chiner,颜值与实用性并存
  10. lammps软件介绍与使用
  11. 封装、继承、多态的详细说明
  12. 流传千古的爱情传说原来竟是一个先劫色后劫财的骗局
  13. 09年国内外免费杀毒软件大收罗
  14. android bks证书生成方式
  15. 【腾讯BUG】QQ群贴超大表情BUG,恶意炸群BUG
  16. C++11之正则表达式(regex_match、regex_search、regex_replace)
  17. 最新的Fresco加载Gif图片
  18. Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园
  19. 常用Linux的ssh远程终端连接工具
  20. linux 计价软件,开源实时计费系统 asterCC

热门文章

  1. Fence Repair (poj3253)
  2. 虚拟世界来自现实世界,同时又促进现实世界
  3. Ajax提交数据判断员工编号是否存在,及自动填充与员工编号所对应的员工姓名。...
  4. 《redis-php中文参考手册》-php版
  5. ARM 指令集跳转指令
  6. XP 装 sql 2008 允许远程连接
  7. Mac. IntelliJ IDEA maven+springmvc添加包时小插曲
  8. 计算机网络学习笔记(14. OSI参考模型②)
  9. JavaScript学习(四十)—字面量创建对象图解
  10. android 按钮点击动画效果_如何用纯css打造类materialUI的按钮点击动画并封装成react组件...