C++实现两个日期间差多少天的解决方法

下面是“C++实现两个日期间差多少天的解决方法”的完整攻略。

一、问题描述

假设有两个日期,分别为 start_dateend_date,请实现一个函数,计算两个日期间相隔的天数。

二、解决思路

我们可以将日期转化为距离某个固定日期的天数,然后求两个日期距离固定日期的天数之差。这里我们取 1900年1月1日 作为固定日期。

将日期转化为天数的方法:假设输入日期为 y1-m1-d1,那么这个日期距离 1900年1月1日 的天数可表示为 day1 = (y1-1900)*365 + leap_years(y1) + month_days[m1-1] + d1 - 1。其中,leap_years(y) 用于计算从1900年到y年之间有多少个闰年, month_days 则表示每个月的天数,需要根据闰年和平年进行调整。

三、示例代码

#include <iostream>
using namespace std;

int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 每个月的天数
int leap_month_days[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年每个月的天数

// 计算从1900年到y之间的闰年数
int leap_years(int y) {
    return (y - 1900) / 4 - (y - 1900) / 100 + (y - 1600) / 400;
}

// 判断是否是闰年
bool is_leap_year(int y) {
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

// 计算日期距离1900年1月1日的天数
int days(int y, int m, int d) {
    int total_days = (y - 1900) * 365; // 距离1900年1月1日的总天数
    total_days += leap_years(y); // 加上闰年数
    for (int i = 0; i < m - 1; i++) {
        if (is_leap_year(y)) {
            total_days += leap_month_days[i]; // 闰年月份天数累加
        } else {
            total_days += month_days[i]; // 平年月份天数累加
        }
    }
    total_days += d - 1; // 加上当前月份天数
    return total_days;
}

// 计算两个日期的差值
int date_diff(int y1, int m1, int d1, int y2, int m2, int d2) {
    int days1 = days(y1, m1, d1);
    int days2 = days(y2, m2, d2);
    return days2 - days1;
}

int main() {
    int start_year, start_month, start_day, end_year, end_month, end_day;
    cout << "请输入开始日期(年 月 日,以空格分隔):" << endl;
    cin >> start_year >> start_month >> start_day;
    cout << "请输入结束日期(年 月 日,以空格分隔):" << endl;
    cin >> end_year >> end_month >> end_day;
    int diff = date_diff(start_year, start_month, start_day, end_year, end_month, end_day);
    cout << "相差天数为:" << diff << " 天" << endl;
    return 0;
}

示例输入1:

请输入开始日期(年 月 日,以空格分隔):
2021 7 1
请输入结束日期(年 月 日,以空格分隔):
2021 7 10

示例输出1:

相差天数为:9 天

示例输入2:

请输入开始日期(年 月 日,以空格分隔):
2021 12 31
请输入结束日期(年 月 日,以空格分隔):
2022 1 1

示例输出2:

相差天数为:1 天

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现两个日期间差多少天的解决方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++11 std::function和std::bind 的使用示例详解

    针对你提到的主题,我会给出相应的markdown格式文本,包含标题、代码块和示例说明,内容完整细致。以下是详细讲解: C++11 std::function和std::bind 的使用示例详解 在C++11标准中,引入了std::function和std::bind两个函数模板,用于支持更灵活的函数对象(函数指针、成员函数指针、函数对象和lambda表达式)…

    C 2023年5月22日
    00
  • Android json解析及简单例子

    好的。首先需要了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在不同的平台之间传输数据,常用于Web API的数据交换。在Android开发中,我们经常会用到JSON格式的数据,因此,掌握Android JSON解析技术是至关重要的。 JSON解析的基本方法 Android中常用的JSON解…

    C 2023年5月23日
    00
  • C++ stringstream格式化输出输入详情

    C++ 的 stringstream 类是一个基于字符串的流,我们可以用它进行格式化输入和输出。在使用 stringstream 进行格式化输出时,可以通过设置类似 printf 函数的格式字符串来控制输出的格式。同时,在使用 stringstream 进行格式化输入时,我们可以根据一个给定的格式字符串来解析输入的字符串数据。接下来,我将详细介绍如何使用 C…

    C 2023年5月23日
    00
  • JavaScript JSON.stringify()的使用总结

    以下是关于“JavaScript JSON.stringify()的使用总结”的完整攻略。 标题 介绍 在JavaScript中,JSON.stringify()是一种将JavaScript对象转换为JSON字符串的方法。它的作用是将一个对象序列化为一个JSON字符串,以便进行传输或存储,或者将其传递给一个将JSON格式数据作为输入的函数中。本文将探讨如何使…

    C 2023年5月23日
    00
  • Excel怎么制作每月的房贷车贷提前还贷计算器?

    制作每月的房贷车贷提前还贷计算器的完整攻略如下: 步骤一:新建 Excel 工作表 首先,打开 Excel 软件并新建工作表。可以直接使用 Excel 自带的模板,也可以自己设计一个。 步骤二:设置表头 在工作表的第一行,设置表头信息,包含如下内容: 月份 剩余本金 当期应还本金 当期应还利息 当期总还款额 提前还款金额 提前还款本金 提前还款后剩余本金 本…

    C 2023年5月22日
    00
  • C 指针

    C语言是一种强大、高效的编程语言,其中指针是其重要特性之一。指针可以用来表示内存中的地址,可以让程序员更灵活地操作内存。在本文中,我将为您详细介绍C语言指针的完整使用攻略。 1. 指针基础 指针是一个变量,其值是另一个变量的地址。这意味着,当您在内存中创建一个变量时,同时也为它分配了一段内存空间。要使用指针,您需要将该变量的地址分配给指针。下面是一个创建指针…

    C 2023年5月10日
    00
  • Arduino控制舵机详解 附代码

    针对这个话题,完整的攻略包含以下几个方面的内容: 标题 需要为文章选择一些明确简洁的标题。该标题应清楚地说明文章主题以及文章具体内容。 概述 在攻略的开头部分,需要对文章做一些简要介绍。这应包括有关文章主题的背景信息以及可能对读者有用的任何上下文信息。 在介绍该话题时可以先讲解一下:Arduino介绍,舵机介绍,这样更容易为读者提供更细致的指导。 前置知识 …

    C 2023年5月23日
    00
  • C++STL教程之vector模板的使用

    C++STL教程之vector模板的使用 什么是vector? vector是C++标准库中的一种容器,可以看作是包含一组元素的动态数组。与C-style数组相比,vector有许多好处: 可以动态调整数组大小,无需手动分配内存 便于元素的插入和删除操作 支持自动内存管理,避免内存泄漏等问题 在使用vector之前,需要引入头文件 #include<v…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部