C语言计算日期间隔天数的经典算法解析

网上看到一个计算日期间隔的方法,很高深,很巧妙。代码如下:

#include <stdio.h>

#include <stdlib.h>

int day_diff(int year_start, int month_start, int day_start

, int year_end, int month_end, int day_end)

{

int y2, m2, d2;

int y1, m1, d1;

m1 = (month_start + 9) % 12;

y1 = year_start - m1/10;

d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);

m2 = (month_end + 9) % 12;

y2 = year_end - m2/10;

d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);

return (d2 - d1);

}

int main(void)

{

printf("%d\n", day_diff(2015, 1, 1, 2015, 1, 8));

printf("%d\n", day_diff(2015, 1, 29, 2015, 2, 9));

return 0;

}

算法解析:

该算法总体思想是计算给定日期到0年3月1日的天数,然后相减,获取天数的间隔。

m1 = (month_start + 9) % 12; 用于判断日期是否大于3月(2月是判断闰年的标识),还用于纪录到3月的间隔月数。

y1 = year_start - m1/10; 如果是1月和2月,则不包括当前年(因为是计算到0年3月1日的天数)。

d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);

其中 365*y1 是不算闰年多出那一天的天数,

y1/4 - y1/100 + y1/400  是加所有闰年多出的那一天,

(m2*306 + 5)/10 用于计算到当前月到3月1日间的天数,306=365-31-28(1月和2月),5是全年中不是31天月份的个数

(day_start - 1)用于计算当前日到1日的间隔天数。

测试运行结果:

C语言计算日期间隔天数的经典算法解析相关推荐

  1. 计算日期间隔天数的经典算法解析

    #include <iostream> using namespace std; int mon[12] = { 0,31,59,90,120,151,181,212,243,273,30 ...

  2. php 日期 间隔,PHP实现计算日期间隔天数的方法

    这篇文章主要介绍了PHP编程计算日期间隔天数的方法,涉及php日期与时间的转换与运算相关操作技巧,需要的朋友可以参考下 刚开始在没有查PHP手册的情况下,用比较老套方法也折腾出来了,代码是这样子实现的 ...

  3. iOS 计算日期间隔天数 —— HERO博客

    计算两个日期间隔天数,下面贴上代码,计算指定日期与当前日期间隔天数: - (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColo ...

  4. 关于Oracle计算日期间隔天数

    最近要计算日期间隔天数,测试发现几个问题,刚开始搜网友的,有些不太靠谱. 1.首先日期不能相加. 2.如果要相减,最好去掉时分秒,格式化成年月日,直接相减的话得到的是小数,日期相减底层应该是操作的毫秒 ...

  5. presto计算日期间隔天数或者小时间隔——date_diff函数使用

    "Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析.据称该引擎的性能是 Hive 的 10 倍以上.",亲身用过之后,觉得比hiv ...

  6. mysql计算日期间隔天数_mysql 计算两个日期之间的天数

    需求:求现在与指定日期之间相隔天数 首先创建一个包含时间字段的表格T如下: mysql> select * from T; +-------------+ | search_time | +-- ...

  7. C语言计算两个日期间隔天数

    C语言计算两个日期间隔天数 代码 总结 代码 // An highlighted block #include <stdio.h> #include <stdlib.h> in ...

  8. 计算两个日期间隔天数(距离(2024-7-7)间隔:1999天)

    /*** 计算两个日期间隔天数*/ public class Demo5 {public static void main(String[] args) {//开始时间LocalDateTime st ...

  9. java计算两个日期间隔天数

    /*** 计算两个日期间隔天数** @param startTime : 开始时间* @param endTime : 结束时间* @return*/public static int caculat ...

最新文章

  1. jQuery Ajax 实例 ($.ajax、$.post、$.get)
  2. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )
  3. vue Watcher分类 computed watch
  4. MybatisPlus 多租户架构(Multi-tenancy)实现
  5. [家里蹲大学数学杂志]第034期中山大学2008年数学分析考研试题参考解答
  6. 【ESIM】论文阅读笔记:文本蕴含之ESIM
  7. 如何使用apktool反编译APK
  8. FLUKE高端时域反射OTDR OFP-100-Q上线
  9. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
  10. RSS概念 以及 POTO周博通 资讯阅读器 使用入门
  11. linux自动同步onedrive,Linux下同步onedrive
  12. Xshell6官网个人免费版下载
  13. 二维隐式查分方程的计算机程序,地下水流动问题数值方法
  14. 《激荡三十年》——来了解我们的时代
  15. 2022年蓝桥杯C++B组题解 - 很详细
  16. anti-debug你必须知道的基础篇 All in one
  17. CNCC2019第三天 | 传统产业如何进行智能化升级?你踩雷了吗?
  18. 分享!快速申请抖音企业蓝V认证的方案
  19. 死亡结束生命,却不会结束一段关系
  20. MapReduce(中文翻译)

热门文章

  1. 区块链+珠宝供应链金融:除了解决信任问题,他们想让数字资产流动起来
  2. 什么是北向接口和南向接口?
  3. IDEA中enter键无法换行
  4. PHP如何实现微信网页授权
  5. 共享停车位的市场现状,共享车位盘活城市闲置车位!
  6. ▼ 系列 | 漫谈数仓第四篇NO.4 『BI选型』
  7. ARM:你从未听说过的英国最成功的科技公司
  8. 微信公众号开发,移动端开发遇到的问题及其他技巧
  9. ResNet 论文阅读笔记
  10. *.LDB文件介绍(转)