日期之间隔几天
题目
题目要求
1.编写一个程序来计算两个日期之间隔了多少天。
日期以字符串形式给出,格式为 YYYY-MM-DD
2.给定的日期是 1971
年到 2100
年之间的有效日期。
3.日期以字符串形式给出。
思路分析
1.可以将两个日期同时计算他们距离1971年1月1日有多少天,再相减,得到差值。
2.计算时要特别注意有多少个闰年。
3.注意,该题涉及到一些字符串操作,例如,字符串转整形。
一、字符串与数字互换(扩展一下知识点,但是在该题因为存在“-”符号,识别会停止)
二 、逐个在数组中提取年月日(代码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; }
运行结果
标签:date1,30,31,几天,days,month,日期,date,例题 From: https://www.cnblogs.com/hcrzhi/p/17300747.html