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日的间隔天数。
这个是好久之前就收了的代码,作者不详,但是觉得很高效简介
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日的间隔天数。
这个是好久之前就收了的代码,作者不详,但是觉得很高效简介