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