1. 程式人生 > >C語言計算日期間隔天數的經典演算法解析

C語言計算日期間隔天數的經典演算法解析

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;

}

演算法解析:

該演算法總體思想是計算給定日期到031日的天數,然後相減,獲取天數的間隔。

m1 = (month_start + 9) % 12; 用於判斷日期是否大於3月(2月是判斷閏年的標識),還用於紀錄到3月的間隔月數。

y1 = year_start - m1/10; 如果是1月和2月,則不包括當前年(因為是計算到031日的天數)。

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 用於計算到當前月到31日間的天數,306=365-31-281月和2月),5是全年中不是31天月份的個數

(day_start - 1)用於計算當前日到1日的間隔天數。

測試執行結果:

https://img-blog.csdn.net/20150207111011044