首页 > 其他分享 >[每天例题]日期之间隔几天

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

时间:2023-04-14 15:45:59浏览次数:56  
标签:date1 30 31 几天 days month 日期 date 例题

日期之间隔几天

题目

 

题目要求

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

  

运行结果

 

 

 

 

标签:date1,30,31,几天,days,month,日期,date,例题
From: https://www.cnblogs.com/hcrzhi/p/17300747.html

相关文章

  • element 设置选择日期范围短
    只能选择今年和去年     <el-date-picker      style="width:100%;"      v-model="sgcxForm.year"      size="small"      type="year"      value-format="yyyy"      :......
  • C++课本第三章例题
    3-2输入一个8位二进制数,将其转换为十进制数输出。1#include<iostream>2usingnamespacestd;3doublepower(doublex,intn);//函数的声明,double类型防止超出整型4intmain()5{6intnumber=0;7for(inti......
  • [每天例题]蓝桥杯 C语言 货物摆放
    货物摆放题目题目要求1.n=L×W×H2.本题的结果为一个整数。3.当n=4n=4时,有以下66种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。由此,我们可以知道L、W、H为n的因子思路分析1.由于n过大,所以使用longlongint进行声明。2.先求出n的所有因数,......
  • QT 计算两个日期时间差?(时间转时间戳)
     时间戳时间转换工具 时间换算工具1、得出的结果单位是:天(不足一天为0,没有半天的说法)QDateTimetime1=QDateTime::fromString("2022-4-2516:40:02","yyyy-MM-ddHH:mm:ss");QDateTimetime2=QDateTime::fromString("2022-4-2716:43:02","yyyy-MM-ddHH:m......
  • 第十四届蓝桥杯省赛c/c++大学B组 试题A:日期统计(无深搜暴力求解)
    试题A:日期统计本题总分:5分【问题描述】小蓝现在有一个长度为100的数组,数组中的每个元素的值都在0到9的范围之内。数组中的元素从左至右如下所示:56869161249198236477595038758158618303792705885709919446......
  • React+Antd在使用form表单提交DatePicker日期框的时候会出现少八小时的情况
    在使用antd做form表单提交的时候,突然发现了一个很有意思的bug.就是在使用datepicker组件日期框的时候会出现提交后少一天的问题我在网上搜索了许多解决办法,也是困扰了我一天的时间,下面代码.letformData=JSON.parse(JSON.stringify(form.getFieldsValue()));......
  • Java 日期
    string和Date的相互转换//string与Date的相互转换用//StringtoDateDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");StringdateTest="2023-4-1114:30:00";Dateparse=null;try{......
  • 直播平台源代码,js 时间戳转为日期格式
    直播平台源代码,js时间戳转为日期格式js把时间戳转为普通日记格式第一种 functiongetLocalTime(nS){     returnnewDate(parseInt(nS)*1000).toLocaleString().replace(/:\d{1,2}$/,'');   } ​第二种 functionadd0(m){returnm<10?'0'+m:m}func......
  • 用Java写一段中国身份证的正则表达式,要求验证身份证中的日期,且大于1900年,以及校验码验
    以下是一个Java正则表达式,可用于验证中国身份证中的日期,并要求日期在1900年及之后:Stringregex="(?:(?:19[0-9]\\d)|(?:[2-9]\\d{3}))(?:0[1-9]|1[012])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";这个正则表达式的含义如下:(?:(?:19[0-9]\\d)|(?:[2-9]\\d{3})):匹配1900年......
  • python - datetime日期加减
    importdatetimenow=datetime.datetime.now()#now=datetime.datetime(2023,4,9)now.strftime('%Y-%m-%d%H:%M:%S')#2023-04-0921:00:41#加7天delta7=datetime.timedelta(days=7)(now+delta7).strftime('%Y-%m-%d%H:%M:%S')#2023-04-......