geekdoc-python-zh/docs/overiq/137.md

5.5 KiB

C 程序:计算两个年月日的日期之差

原文:https://overiq.com/c-examples/c-program-to-calculate-the-difference-of-two-dates-in-years-months-and-days/

最后更新于 2020 年 9 月 24 日


下面是一个计算年、月、日两个日期差的 C 程序。确保开始日期早于结束日期。

/*******************************************************************
 Program to calculate the number of days, months and years
 between two dates dates
 * 
 * Enter first date (MM/DD/YYYY): 05/20/2004
 * Enter second date (MM/DD/YYYY): 06/05/2008
 * 
 * Difference: 4 years 00 months and 15 days.
 *******************************************************************/

#include<stdio.h> // include stdio.h library
#include<stdlib.h> // include stdlib.h library
int valid_date(int date, int mon, int year);

int main(void)
{
    int day1, mon1, year1,
        day2, mon2, year2;

    int day_diff, mon_diff, year_diff;         

    printf("Enter start date (MM/DD/YYYY): ");
    scanf("%d/%d/%d", &mon1, &day1, &year1);

    printf("Enter end date (MM/DD/YYYY): ");
    scanf("%d/%d/%d", &mon2, &day2, &year2);

    if(!valid_date(day1, mon1, year1))
    {
        printf("First date is invalid.\n");        
    }

    if(!valid_date(day2, mon2, year2))
    {
        printf("Second date is invalid.\n");
        exit(0);
    }       

    if(day2 < day1)
    {      
        // borrow days from february
        if (mon2 == 3)
        {
            //  check whether year is a leap year
            if ((year2 % 4 == 0 && year2 % 100 != 0) || (year2 % 400 == 0)) 
            {
                day2 += 29;
            }

            else
            {
                day2 += 28;
            }                        
        }

        // borrow days from April or June or September or November
        else if (mon2 == 5 || mon2 == 7 || mon2 == 10 || mon2 == 12) 
        {
           day2 += 30; 
        }

        // borrow days from Jan or Mar or May or July or Aug or Oct or Dec
        else
        {
           day2 += 31;
        }

        mon2 = mon2 - 1;
    }

    if (mon2 < mon1)
    {
        mon2 += 12;
        year2 -= 1;
    }       

    day_diff = day2 - day1;
    mon_diff = mon2 - mon1;
    year_diff = year2 - year1;

    printf("Difference: %d years %02d months and %02d days.", year_diff, mon_diff, day_diff);

    return 0; // return 0 to operating system
}

// function to check whether a date is valid or not

int valid_date(int day, int mon, int year)    
{
    int is_valid = 1, is_leap = 0;

    if (year >= 1800 && year <= 9999) 
    {

        //  check whether year is a leap year
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 
        {
            is_leap = 1;
        }

        // check whether mon is between 1 and 12
        if(mon >= 1 && mon <= 12)
        {
            // check for days in feb
            if (mon == 2)
            {
                if (is_leap && day == 29) 
                {
                    is_valid = 1;
                }
                else if(day > 28) 
                {
                    is_valid = 0;
                }
            }

            // check for days in April, June, September and November
            else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) 
            {
                if (day > 30)
                {
                    is_valid = 0;
                }
            }

            // check for days in rest of the months 
            // i.e Jan, Mar, May, July, Aug, Oct, Dec
            else if(day > 31)
            {            
                is_valid = 0;
            }        
        }

        else
        {
            is_valid = 0;
        }

    }
    else
    {
        is_valid = 0;
    }

    return is_valid;

}

现在试试

预期输出:

第一次运行:

Enter start date (MM/DD/YYYY): 08/05/2001
Enter end date (MM/DD/YYYY): 08/20/2001
Difference: 0 years 00 months and 15 days.

第二次运行:

Enter start date (MM/DD/YYYY): 10/11/2005
Enter end date (MM/DD/YYYY): 05/20/2016
Difference: 10 years 07 months and 09 days.

它是如何工作的

用年、月、日来计算两个日期之差的过程很简单。我们需要做的就是分别从结束日期的日、月、年中减去开始日期的日、月、年。

date_diff = day2 - day1
mon_diff = mon2 - mon1
year_diff = year2 - year1

请注意,这里我们假设开始日期小于结束日期,并且天数、月数和年数的差值将为正值。

然而,有一个问题。

如果天数和月数的差异不是正值呢?

例如,考虑以下两个日期:

08/25/2001 (25 Aug 2001)
05/05/2005 (05 May 2005)

在这种情况下,第一个日期小于第二个日期,但天数和月数的差异不是正的。

date_diff = day2 - day1
date_diff = 5 - 25
date_diff = -20

mon_diff = mon2 - mon1
mon_diff = 5 - 8
mon_diff = -3

为了处理这种情况,我们执行以下操作:

如果day2 < day1,我们借用mon2之前的一个月,将该月的天数加到day2。比如mon2 == 09即 9 月,那么我们借月 8 月,把 8 月的天数加到day2上。

day2 = day2 + 30。(8 月有 30 天)

此外,由于我们借了一个月,我们必须从mon2中减去1

mon2 = m2 - 1

同样的,如果mon2 < mon1,那么我们借一个 1 年,也就是 12 个月,再加上这个多月到mon2

mon2 = mon + 12

同样,就像月份一样,我们必须从year中减去1

year2 = year2 - 1