加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

C语言计算日期间隔天数的经典算法介绍

发布时间:2021-11-19 15:59:48 所属栏目:教程 来源:互联网
导读:在网上看到了一个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,
在网上看到了一个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("%dn", day_diff(2015, 1, 1, 2015, 1, 8));
 printf("%dn", 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日的间隔天数。

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读