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日的间隔天数。

测试运行结果:

时间: 2024-12-13 16:12:38

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

PHP 计算两个日期间隔天数

PHP 计算两个日期间隔天数,可以使用date_diff( )函数: <?php $datetime1 = date_create('2009-10-11'); $datetime2 = date_create('2009-10-13'); $interval = date_diff($datetime1, $datetime2); echo $interval->format('%R%a days'); ?> 浏览器输出结果:

计算 两日期 间隔天数 zzuli1878

#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<algorithm>using namespace std;#define N 1010000#define INF 0x3f3f3f3f int yearday[N]; int IsLeap(int

js计算日期相差天数

function DateDiff(sDate1, sDate2) { //sDate1和sDate2是2017-9-25格式 var aDate, oDate1, oDate2, iDays aDate = sDate1.split("-") oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //转换为9-25-2017格式 aDate = sDate2.split("-") oDate2

计算日期到天数转换

import java.util.Scanner; public class CountDays { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int year = scan.nextInt(); int month = scan.nextInt(); int day = scan.nextInt(); int []a = {31,28,31,30,31,30,31,31,30,

如何计算两个(年-月-日)中间的间隔天数

给出任意两个时间,计算其间隔天数应该如何进行? 思路一: 以日期较小的一个为参考对象,然后将日期一天天的加上去,直到和第二个日期完全相等,设置一个计数器(day++)来统计天数. 思路二: 上边的问题是将整个问题视为一个整体进行解决,那么正是因为问题的复杂性,为了使用编程来更好的模块化解决,我们引入参考日期(1900-01-01).将两个日期都与参考日期进行对比,计算出天数差.而后根据天数差做一个减法,得到二者之间的天数差. 思路三: 在思路二的基础上进一步进行改进.(思路二存在的问题是若询问的

JS计算从某年某月某日到某年某月某日的间隔天数差

直接贴代码了,你直接拷贝然后另存为html就可以用了,不多说,请看: <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head> <meta charset="utf-8" /> <title></title> <script type="text/javascript

java计算两日期间隔小时或分钟

public static void main(String[] args) {        try {            long min = dateDiff("2014-05-27 13:30:00","2014-05-27 13:00:00","yyyy-MM-dd HH:mm:ss");            System.out.println("---------相隔分钟数: "+min);        

日期计算_隔多少天后的日期_两个日期的天数

1 //Date.cpp 2 #include<iostream> 3 #include<time.h> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 //Date_class 8 class Date 9 { 10 private: 11 int year, month, day; 12 int week; //存放星期 13 void IncDay(); //日期增加一天函数

Js 时间间隔计算(间隔天数)

Js 时间间隔计算(间隔天数) 1 2 3 4 5 6 7 function GetDateDiff(startDate,endDate)  {      var startTime = new Date(Date.parse(startDate.replace(/-/g,   "/"))).getTime();         var endTime = new Date(Date.parse(endDate.replace(/-/g,   "/"))).getT