zoukankan      html  css  js  c++  java
  • 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 ", day_diff(2015, 1, 1, 2015, 1, 8));  printf("%d ", 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日的间隔天数。

  • 相关阅读:
    hdu 2222 Keywords Search 模板题
    AC自动机 (模板)
    7. 通过鼠标右键改变视角
    NGUI所见即所得之UIAtlasMaker , UIAtlas (2)
    6. 通过鼠标滑轮控制“镜头远近”
    5. Unity脚本的执行顺序
    4. 在Inspector面板中显示类中变量+ 拓展编辑器
    NGUI 的使用教程与实例(入门)(1 )
    1. 通过移动鼠标旋转摄像机观察模型
    C#面试题
  • 原文地址:https://www.cnblogs.com/pigdragon/p/6600087.html
Copyright © 2011-2022 走看看