[每天例题]日期之间隔几天

发布时间 2023-04-14 15:45:02作者: 山远尽成云

日期之间隔几天

题目

 

题目要求

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,存在“-”符号,所以,我们可以建立一个数组,date[10]。
年份为:year=(date[0])*1000+(date[1])*100+(date[2])*10+(date[3])*1
月份为:month=(date[5])*10+(date[6])*1

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

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

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

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

  

 代码2

inint 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; }

  

运行结果