C++ 计算日期差

 

#include <iostream>
using namespace std;

//定义日期结构体,用于存放年、月、日这三个日期相关的信息
struct Date
{
    int year;
    int month;
    int day;
};

int main()
{
    Date d1, d2;
    //从标准输入(控制台)读取第一个日期的年、月、日信息
    cin >> d1.year >> d1.month >> d1.day;
    //从标准输入(控制台)读取第二个日期的年、月、日信息
    cin >> d2.year >> d2.month >> d2.day;

    int days = 0;  //用于记录两个日期之间相差的天数,初始化为0

//判断第一个日期的年份是否小于第二个日期的年份,如果小于,则先按年逐步推进第一个日期到下一年
    if (d1.year < d2.year)
    {
        //当月份还没到12月时(即当前年还没结束),进行以下循环操作
        while (d1.month < 12)
        {
            d1.day++;  //日期天数加1,表示日子往后推一天
            days++;    //相差天数也加1,因为每过一天,两个日期之间的天数差就多一天

            //根据当前月份进行不同的日期边界判断和日期、月份的更新操作
            switch (d1.month)
            {
            // 处理大月(31天的月份)的情况
            case 1: case 3: case 5:
            case 7: case 8: case 10:
            case 12:
                //如果当前日期的天数超过了31天,说明进入下一个月了
                if (d1.day > 31)
                {
                    d1.month++;  // 月份加1,进入下一个月
                    d1.day = 1;  // 日期重置为1号
                }
                break;
            //处理2月的情况,要考虑闰年和平年不同的天数情况
            case 2:
                //判断是否为闰年(能被4整除但不能被100整除,或者能被400整除就是闰年)
                if (d1.year / 4 == 0 && d1.year % 100!= 0
                    || d1.year % 400 == 0)
                {
                    //如果是闰年且当前日期天数超过29天,进入下一个月
                    if (d1.day > 29)
                    {
                        d1.month++;
                        d1.day = 1;
                    }
                }
                else
                {
                    //如果是平年且当前日期天数超过28天,进入下一个月
                    if (d1.day > 28)
                    {
                        d1.month++;
                        d1.day = 1;
                    }
                }
                break;
            //处理小月(30天的月份)的情况
            default:
                if (d1.day > 30)
                {
                    d1.month++;
                    d1.day = 1;
                }
                break;
            }
        }
        //当前年结束后,年份加1,进入下一年,月份重置为1月
        d1.year++;
        d1.month = 1;
        //加上一整年
//(按平年365天算,这里先简单加31天表示过渡到下一年年初,后续月份推进还会继续准确计算天数)
        days += 31;
    }

    //当第一个日期的月份小于第二个日期的月份时,进行以下循环操作,按月份逐步推进第一个日期
    while (d1.month < d2.month)
    {
        d1.day++;  //日期天数加1,表示日子往后推一天
        days++;    //相差天数也加1,因为每过一天,两个日期之间的天数差就多一天

    //根据当前月份进行不同的日期边界判断和日期、月份的更新操作,和前面判断年份时的逻辑类似
        switch (d1.month)
        {
        case 1: case 3: case 5:
        case 7: case 8: case 10:
        case 12:
            if (d1.day > 31)
            {
                d1.month++;
                d1.day = 1;
            }
            break;
        case 2:
            if (d1.year / 4 == 0 && d1.year % 100!= 0
                || d1.year % 400 == 0)
            {
                if (d1.day > 29)
                {
                    d1.month++;
                    d1.day = 1;
                }
            }
            else
            {
                if (d1.day > 28)
                {
                    d1.month++;
                    d1.day = 1;
                }
            }
            break;
        default:
            if (d1.day > 30)
            {
                d1.month++;
                d1.day = 1;
            }
            break;
        }
    }

    //当第一个日期的天数小于第二个日期的天数时,进行以下循环操作
    //按天逐步推进第一个日期,直到天数相等
    while (d1.day < d2.day)
    {
        d1.day++;  //日期天数加1,表示日子往后推一天
        days++;    //相差天数也加1,因为每过一天,两个日期之间的天数差就多一天
    }

    //将计算得到的两个日期之间相差的天数输出到控制台
    cout << days;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值