【每天例题】日期之间隔几天

日期之间隔几天

题目

 

题目要求

1.编写一个程序来计算两个日期之间隔了多少天。

日期以字符串形式给出,格式为 YYYY-MM-DD

2.给定的日期是 1971 年到 2100 年之间的有效日期。

3.日期以字符串形式给出。

思路分析

1.可以将两个日期同时计算他们距离1971年1月1日有多少天,再相减,得到差值。

2.计算时要特别注意有多少个闰年。

3.注意,该题涉及到一些字符串操作,例如,字符串转整形。

一、字符串与数字互换(扩展一下知识点,但是在该题因为存在“-”符号,识别会停止)

https://blog.csdn.net/weixin_57663206/article/details/128513642?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168128419616800226575332%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168128419616800226575332&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-128513642-null-null.142^v82^insert_down1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%E5%A6%82%E4%BD%95%E5%B0%86%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E4%B8%BA%E6%95%B0%E5%80%BCC%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187

二 、逐个在数组中提取年月日(代码2)

由于本题字符串输入形式为 

由于本题字符串输入形式为 YYYY-MM-DD

年份为:year=(date[0])*1000+(date[1])*100+(date[3])*10+(date[4])*1

月份为:month=(date[5])*10+(date[6])*1

日为:day=(date[8])*10+(date[9])*1

date[4]、date[7]为字符“-”

代码1(该代码为通俗计算8位数日期间隔多少天,适应本道题可以使i=1971,注意,该代码没有判断日期合法性,且该代码没有满足题目以字符串形式输入的要求)

#include
struct date
{
    int year;
    int month;
    int day;
};
int main()
{
    int common[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年每个月天数
    int leap[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年每个月天数 
    struct date date1,date2;
    scanf( "%d-%d-%d" ,&date1.year,&date1.month,&date1.day);
    scanf( "%d-%d-%d" ,&date2.year,&date2.month,&date2.day); 
   
     //日期是否合法

    if (date1.month==0||date1.month>12)
    {
        return 0;
    }
    if (date1.month!=2)
    {
        if (date1.day==0||date1.day>common[date1.month])
        {
            return 0;
        }
    }
    else
    {
        if ((date1.year%400==0)||(date1.year%4==0&&date1.year%100!=0));
        {
            if (date1.day==0||date1.day>leap[date1.month])
            {
                return 0;
            }
        }
    }
}



    int i,j;
    int days1,days2;
    days1=0,days2=0; //计算两个日期到一月一日的天数 
    for (i=1;i<date1.year;i++) day1到="" i有多少闰年="" {="" if="" ((i%4="=0&&i%100!=0)||(i%400!=0))" days1++;="" }="" int="" month_day1="0;" 计算day1月份的一日到当年一月一日的天数="" ((date1.year%4="=0&&date1.year%100!=0)||(date1.year%400==0))" 计算当年是不是闰年="" for="" (j="0;j<date1.month;j++)" month_day1+="common[j];" else="" } ="" days1="(date1.year-1)*365+days1+month_day1+date1.day;" day1年份-1是因为不计算day1那一年="" (i="1;i<date2.year;i++)" day2到="" days2++;="" month_day2="0;" 计算day2月份的一日到当年一月一日的天数="" ((date2.year%4="=0&&date2.year%100!=0)||(date2.year%400==0))" month_day2+="common[j];" days2="(date2.year-1)*365+days2+month_day2+date2.day;" day2年份-1是因为不计算day2那一年="" (days1="">days2)
    {
        printf( "%d" ,days1-days2);
    }
    else
    {
        printf( "%d" ,days2-days1);
    }
    return 0;
}</date1.year;i++)>

  

 代码2

int days( char *date) //将字符串日期化为日期,且计算距离1971年的天数 
{
int year,month,day,ret,flag; //flag判断是否为闰年 int days_month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //声明平年日历数 //字符串转化为数字 year=(date[0]- '0' )*1000+(date[1]- '0' )*100+(date[2]- '0' )*10+(date[3]- '0' ); month=(date[5]- '0' )*10+(date[6]- '0' ); day=(date[8]- '0' )*10+(date[9]- '0' ); ret=day; month--; while (year>=1971) { flag=0; //1971不是闰年 if ((year%4==0&&year%100!=0)||(year%400==0)) { flag=1; //判断出闰年 } while (month>0) { if (month==2&&flag==1) //闰年2月 { ret+=1; //比平年多加1天 flag=0; //因为多加1天后,可以直接使用平年的日历数,所以另flag为1 } ret+=days_month[--month]; //加上每个月的日期 } year--; //年份往前推,直到等于1971年为止 month=12; } return ret;   } int daysBetweenDates( char * date1, char * date2) { int days_1,days_2,ret; days_1=days(date1); days_2=days(date2); //接收两个字符串转为数字的日期 if (days_1>days_2) //用大日期减去小日期得到两日期相隔天数 { ret=days_1-days_2; } else { ret=days_2-days_1; } return ret; }

  

运行结果

 

 

 

 

posted @ 2023-04-14 15:36  山远尽成云  阅读(90)  评论(0)    收藏  举报