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;
}
算法解析:
该算法总体思想是计算给定日期到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日的间隔天数。
测试运行结果:
C语言计算日期间隔天数的经典算法解析相关推荐
- 计算日期间隔天数的经典算法解析
#include <iostream> using namespace std; int mon[12] = { 0,31,59,90,120,151,181,212,243,273,30 ...
- php 日期 间隔,PHP实现计算日期间隔天数的方法
这篇文章主要介绍了PHP编程计算日期间隔天数的方法,涉及php日期与时间的转换与运算相关操作技巧,需要的朋友可以参考下 刚开始在没有查PHP手册的情况下,用比较老套方法也折腾出来了,代码是这样子实现的 ...
- iOS 计算日期间隔天数 —— HERO博客
计算两个日期间隔天数,下面贴上代码,计算指定日期与当前日期间隔天数: - (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColo ...
- 关于Oracle计算日期间隔天数
最近要计算日期间隔天数,测试发现几个问题,刚开始搜网友的,有些不太靠谱. 1.首先日期不能相加. 2.如果要相减,最好去掉时分秒,格式化成年月日,直接相减的话得到的是小数,日期相减底层应该是操作的毫秒 ...
- presto计算日期间隔天数或者小时间隔——date_diff函数使用
"Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析.据称该引擎的性能是 Hive 的 10 倍以上.",亲身用过之后,觉得比hiv ...
- mysql计算日期间隔天数_mysql 计算两个日期之间的天数
需求:求现在与指定日期之间相隔天数 首先创建一个包含时间字段的表格T如下: mysql> select * from T; +-------------+ | search_time | +-- ...
- C语言计算两个日期间隔天数
C语言计算两个日期间隔天数 代码 总结 代码 // An highlighted block #include <stdio.h> #include <stdlib.h> in ...
- 计算两个日期间隔天数(距离(2024-7-7)间隔:1999天)
/*** 计算两个日期间隔天数*/ public class Demo5 {public static void main(String[] args) {//开始时间LocalDateTime st ...
- java计算两个日期间隔天数
/*** 计算两个日期间隔天数** @param startTime : 开始时间* @param endTime : 结束时间* @return*/public static int caculat ...
最新文章
- jQuery Ajax 实例 ($.ajax、$.post、$.get)
- 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )
- vue Watcher分类 computed watch
- MybatisPlus 多租户架构(Multi-tenancy)实现
- [家里蹲大学数学杂志]第034期中山大学2008年数学分析考研试题参考解答
- 【ESIM】论文阅读笔记:文本蕴含之ESIM
- 如何使用apktool反编译APK
- FLUKE高端时域反射OTDR OFP-100-Q上线
- 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
- RSS概念 以及 POTO周博通 资讯阅读器 使用入门
- linux自动同步onedrive,Linux下同步onedrive
- Xshell6官网个人免费版下载
- 二维隐式查分方程的计算机程序,地下水流动问题数值方法
- 《激荡三十年》——来了解我们的时代
- 2022年蓝桥杯C++B组题解 - 很详细
- anti-debug你必须知道的基础篇 All in one
- CNCC2019第三天 | 传统产业如何进行智能化升级?你踩雷了吗?
- 分享!快速申请抖音企业蓝V认证的方案
- 死亡结束生命,却不会结束一段关系
- MapReduce(中文翻译)