计算任意两个日期之间相隔的天数以及年数

计算任意两个日期之间相隔的天数以及年数。
//<思路>
//历法规定,四年一闰,四百年闰,例如2000年是闰年,2100年不闰年,
//公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的就是平年
//计算两个日期之间的天数(C++) 
//定义变量year1, month1, day1, year2, month2, day2
//首先比较两个日期,将小的给date1
//再将date1进行加1,一直增加到date2的日期
//其中当天数大于GetLastDay时,月数加1,同理当月数大于12时,年加1
//再这过程中delta进行自增(++)——> return delta;
/*
问题: 给你两个日期(如"2017,8,18"和"2013,6,11"),求它们之间相差的天数
分析: 这是一年看似简单,实际上却有点复杂的小问题,首先你要考虑到月大月小的问题,其次你要考虑到闰年的问题
当然,你也要检测一下,给定的日期格式是否合法,对这个问题的解法,写出伪代码如下

*/




#include <Windows.h>  
#include <stdio.h>  


struct tagDate  
{   
    int year;  
    int month;  
    int day;  
};  

//设置日期  
void SetDate(int y, int m, int d, tagDate *date)  
{   
    date->year = y;  
    date->month = m;  
    date->day = d;  
}   

//是否闰年  
int IsLeapYear(int year)    
{   
    return ((year%4==0) && (year%100!=0)||year%400==0);   
}   

//得到date.month的最大天数  
int GetLastDay(tagDate date)   
{   
    int num;  
    switch(date.month)   
    {  
    case  1:  
    case  3:  
    case  5:  
    case  7:  
    case  8:  
    case 10:  
    case 12:  
        num=31;  
        break;  
    case  2:  
        num = 28+IsLeapYear(date.year);   
        break;   
    default:   
        num = 30;   
    }   
    return num;   
}  

//日期是否合法  
int IsDateValid(tagDate date)  
{   
    if(date.year <0 || date.month <1 || date.month> 12)   
        return 0;  

    if(date.day <1 || date.day> GetLastDay(date))  
        return 0;  

    return 1;  
}   

//date+1  
void AddDay(tagDate *date)  
{  
    date->day++;  
    if(date->day > GetLastDay(*date))  
    {  
        date->day = 1;  
        date->month++;  
        if(date->month > 12)  
        {  
            date->month = 1;  
            date->year++;  
        }  
    }  
}  

//date1比date2小返回值为1,否则为0  
int Compare(tagDate date1, tagDate date2)  
{  
    if(date1.year < date2.year)  
        return 1;  
    if(date1.year <= date2.year && date1.month < date2.month)  
        return 1;  
    if(date1.year <= date2.year && date1.month <= date2.month && date1.day < date2.day)  
        return 1;  

    return 0;  
}   
//计算两个日期的间隔天数  
long DateDiff(tagDate date1, tagDate date2)  
{  
    long delta = 0;  
    tagDate date3;  
    //若date1 > date2,交换date1,date2  
    if(!Compare(date1, date2))  
    {  
        date3 = date2;  
        date2 = date1;  
        date1 = date3;  
    }  

    //date1比date2少时,date1日期加1  
    while(Compare(date1,date2))  
    {  
        AddDay(&date1);  
        delta++;  
    }  
    return delta;  
}   

void main()  
{  
    tagDate date1, date2;  
    int y, m, d;  

    system("cls");

    while(1)  
    {  
        puts("Please Input date1\t ");  
        scanf("%d,%d,%d", &y, &m, &d);  
        SetDate(y, m, d, &date1);  
        if(!IsDateValid(date1))  
        {   
            puts( "date1   is   invalid !");  
            exit(1);  
        }  

        puts("\nPlease Input date2\t ");  
        scanf("%d,%d,%d", &y, &m, &d);  
        SetDate(y, m, d, &date2);  
        if(!IsDateValid(date2))  
        {  
            puts( "date2   is   invalid !");  
            exit(1);  
        }  
        //返回的天数,以及年数 
        printf("\nResult : %ld day [about %.2f year]\n", DateDiff(date1,date2),DateDiff(date1,date2)/365.0);  
    }  
}  

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值