IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 计算两个日期相差多少天 -> 正文阅读

[C++知识库]计算两个日期相差多少天

/**
 * 思路是循环累加两个相差的年份, 然后再减去较小年份的日期走过多少天, 加上较大年份的日期走过多少天
 * 
 * 比如 2000/04/05-2002/05/02
 * 
 * |----------+---/--------------------------------------|----------+---/
 * 2000       4  5                                      2002       5  2
 * 
 * [----------------for 循环年得到的天数------------------]
 * [-减去走过的天数-]                                     [-加上走过的天数-]
 *                 [----------------------最终天数-----------------------] 
 *           
 */

#include <stdio.h>

static inline int is_leap_year(unsigned int year)
{
    return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
}

typedef struct
{
    int year;
    int month;
    int day;
} rtc_date_t;

const static int month_days[2][13] = {
    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31}, /* 润年月 */
    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31}, /* 平年月 */
};

/* 计算两个日期相差多少天 */
int dday(rtc_date_t date1, rtc_date_t date2)
{
    rtc_date_t *dmax = date1.year > date2.year ? &date1 : &date2;
    rtc_date_t *dmin = date1.year > date2.year ? &date2 : &date1;

    int days = 0;

    for (int y = dmin->year; y < dmax->year; y++)
        days += is_leap_year(y) ? 366 : 365;

    /* 减去较小的日期走过多少天 */
    int leap = is_leap_year(dmin->year);
    for (int m = 1; m < dmin->month; m++)
        days -= month_days[leap][m - 1];

    /* 加上较大的日期走过多少天 */
    leap = is_leap_year(dmax->year);
    for (int m = 1; m < dmax->month; m++)
        days += month_days[leap][m - 1];

    days += dmax->day - dmin->day;

    return days < 0 ? -days : days;
}

/* 测试 */
int main(int argc, char const *argv[])
{
    rtc_date_t d1;
    rtc_date_t d2;

    scanf("%d %d %d %d %d %d", &d1.year, &d1.month, &d1.day, &d2.year, &d2.month, &d2.day);

    int days = dday(d1, d2);

    printf("%04d/%02d/%02d - %04d/%02d/%02d --> %d days\n", d1.year, d1.month, d1.day, d2.year, d2.month, d2.day, days);

    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:30:43  更:2022-04-30 08:32:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:49:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码