| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 19317 人关注过本帖
标题:计算任意两个日期的天数
只看楼主 加入收藏
雨铃半百
Rank: 1
来 自:223-3
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-10-8
收藏
得分:0 
1.    #include <stdio.h>  
2.    #include <stdlib.h>  
3.      
4.    int day_diff(int year_start, int month_start, int day_start  
5.                , int year_end, int month_end, int day_end)  
6.    {  
7.        int y2, m2, d2;  
8.        int y1, m1, d1;  
9.         
10.        m1 = (month_start + 9) % 12;  
11.        y1 = year_start - m1/10;  
12.        d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);
13.      
14.        m2 = (month_end + 9) % 12;  
15.        y2 = year_end - m2/10;  
16.        d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);  
17.         
18.        return (d2 - d1);  
19.     }  
20.      
21.     int main(void)  
22.     {  
23.        printf("%d\n", day_diff(2015, 1, 1, 2015, 1, 8));  
24.        printf("%d\n", day_diff(2015, 1, 29, 2015, 2, 9));  
25.         
26.        return 0;  
27.     }  

算法解析:
该算法总体思想是计算给定日期到 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日的间隔天数。


这个是好久之前就收了的代码,作者不详,但是觉得很高效简介
2018-04-11 18:25
快速回复:计算任意两个日期的天数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023207 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved