C语言计算两个日期之间相差的天数

设计思路

1、比较起始和结束的年份大小,起始年是否大于结束年,如果起始时间大于输入的结束时间,则把两个时间(年月日)互换值,再计算两个时间相差的天数。

2、判断是否起始时间小于结束时间,直接计算两个时间相差的天数。

3、判断是否为闰年。

代码如下

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int s_year, s_month, s_day, s_sum = 0;
    static int days = 0;
    static int day = 0;
    int e_year, e_month, e_day, e_sum = 0;
    static int leap = 0;
    int tmp, tmp1, tmp2; 

    printf("输入起始时间,格式为:年,月,日(xxxx,xx,xx)\n");
    scanf_s("%d,%d,%d", &s_year, &s_month, &s_day);

    printf("输入结束时间,格式为:年,月,日(xxxx,xx,xx)\n");
    scanf_s("%d,%d,%d", &e_year, &e_month, &e_day);

    if (s_year > e_year) //判断哪个年份大,如果起始时间大于结束时间,则互换值
    {
        tmp = s_year;
        s_year = e_year;
        e_year = tmp;
        tmp1 = s_month;
        s_month = e_month;
        e_month = tmp1;
        tmp2 = s_day;
        s_day = e_day;
        e_day = tmp2;
    }

    while (s_year < e_year)
    {
        if (e_year % 400 == 0 || (e_year % 4 == 0 && e_year % 100 != 0)) /*判断是否为闰年*/
        {
            days = days + 366; /*闰年*/
        }
        else
        {
            days = days + 365; /*平年*/
        }
        e_year--;
    }

    switch (s_month)
    {
    case 1:s_sum = 0;
        break;
    case 2:s_sum = 31;
        break;
    case 3:s_sum = 31 + 28;
        break;
    case 4:s_sum = 31 + 28 + 31;
        break;
    case 5:s_sum = 31 + 28 + 31 + 30;
        break;
    case 6:s_sum = 31 + 28 + 31 + 30 + 31;
        break;
    case 7:s_sum = 31 + 28 + 31 + 30 + 31 + 30;
        break;
    case 8:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
        break;
    case 9:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
        break;
    case 10:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
        break;
    case 11:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
        break;
    case 12:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
        break;
    }

    s_sum = s_sum + s_day; /*计算起始日期天数*/

    switch (e_month)
    {
    case 1:e_sum = 0;
        break;
    case 2:e_sum = 31;
        break;
    case 3:e_sum = 31 + 28;
        break;
    case 4:e_sum = 31 + 28 + 31;
        break;
    case 5:e_sum = 31 + 28 + 31 + 30;
        break;
    case 6:e_sum = 31 + 28 + 31 + 30 + 31;
        break;
    case 7:e_sum = 31 + 28 + 31 + 30 + 31 + 30;
        break;
    case 8:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
        break;
    case 9:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
        break;
    case 10:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
        break;
    case 11:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
        break;
    case 12:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
        break;
    }


    if (s_year % 400 == 0 || (s_year % 4 == 0 && s_year % 100 != 0))
    {
        if (e_month > 2)
        {
            day++;
        }
    }

    e_sum = e_sum + e_day; /*计算结束日期天数*/
    days = days - s_sum + e_sum + day; /*相差的天数*/

    printf("起始和结束日期相差了%d天\n", abs(days)); //因天数计算可能会出现负数,abs()函数可把相差的天数变成正数
    return 0;
}

运行结果

结果1:结束日期大于初始日期

结果2:初始日期大于结束日期 

 

  • 16
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值