判断两个指定日期间经过的天数

解题思路

坐标轴辅助理解:
在这里插入图片描述

首先求两个日期之间完整的年份的天数。例如2017年到2021年之间,共有3个完整的年份,分别是2018年,2019年和2020年。通过循环来累加这三个年份的天数,如果某年是闰年,则天数加366,如果是平年,天数加365。

for(int i=year1+1;i<year2;i++){
			if(i%4==0&&i%100!=0||i%400==0){
				countyears+=366;
			}else{
				countyears+=365;
			}
		}

其次,求较小年份到下一年要经过几天,首先求得该年已经过去了几天,然后用该年的总天数减去已经过去的天数,可得该年距离下一年份的天数。
具体实现思路:先求该年完整月份的天数,然后用此天数加上用户输入的日期中的号,求得该年已经过去的天数。
如2017年3月1号,该年共有两个完整的月份,一月31天,17年是平年,二月有28天,三月度过1天,2017年共度过31+28+1=60天,距离2018年还有365-60=305天。
此处设两个一维数组(一个存放平年的月份天数,一个存放闰年的月份天数)用来存储每个月份对应的天数,首项设为零,方便后面完整月份的累加,最后一项设为0,用于天数的累加。中间12项存放一月到12月之间每个月份的天数。

        int[] days1={0,31,28,31,30,31,30,31,31,30,31,30,31,0};  //平年月份的每天天数,第一项设为零便于后面的计算,最后一项设为零用于累加,下同
		int[] days2={0,31,29,31,30,31,30,31,31,30,31,30,31,0};  //闰年月份的每天天数
if(year1%4==0&&year1%100!=0||year1%400==0){
			for(int i=0;i<month1;i++){
				days2[13]+=days2[i];
			}
			days2[13]+=day1;
			days2[13]=366-days2[13];
		}else{
			for(int i=0;i<month1;i++){
				days1[13]+=days1[i];
			}
			days1[13]+=day1;
			days1[13]=365-days1[13];
		}

较大日期求经过的天数如上,此处不再赘述。

如果用户输入的是同一年的两个日期,由下图的时间轴可以看出,我们需要求的时间为阴影部分,实际求得的时间为时间段1+时间段2,多加了一年的时间,因此需要用通过上面的方法求得的总天数减去该年的天数。

在这里插入图片描述

if(year1==year2){
			if(year2%4==0&&year2%100!=0||year2%400==0)
			{
				count=count-366;
			}else{
				count=count-365;
			}
			if(count<0){
				count=-count;
			}
		}

完整代码如下:

package java案例;
import java.util.Scanner;
@SuppressWarnings("unused")
public class countdays {
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		int countyears=0;  //用于两个年份之间的天数
		int count;        //总天数
		int[] days1={0,31,28,31,30,31,30,31,31,30,31,30,31,0};  //平年月份的每天天数,第一项设为零便于后面的计算,最后一项设为零用于累加,下同
		int[] days2={0,31,29,31,30,31,30,31,31,30,31,30,31,0};  //闰年月份的每天天数
		System.out.println("*****求两个日期之间的天数******");
		System.out.print("请输入第一个日期的年份:");
		int year1=scan.nextInt();
		System.out.print("请输入第一个日期的月份:");
		int month1=scan.nextInt();
		System.out.print("请输入第一个日期的日:");
		int day1=scan.nextInt();	
		System.out.print("请输入第二个日期的年份:");
		int year2=scan.nextInt();
		System.out.print("请输入第二个日期的月份:");
		int month2=scan.nextInt();
		System.out.print("请输入第二个日期的日:");
		int day2=scan.nextInt();
		/*如果输入的第一个年份大于输入的第二个年份,则交换两个日期*/
		if(year1>year2){
			int temp;
			temp=year1;
			year1=year2;
			year2=temp;
			temp=month1;
			month1=month2;
			month2=temp;
			temp=day1;
			day1=day2;
			day2=temp;
		}
		/*求两个日期之间整年的天数*/
		for(int i=year1+1;i<year2;i++){
			if(i%4==0&&i%100!=0||i%400==0){
				countyears+=366;
			}else{
				countyears+=365;
			}
		}
		/*求较小的日期当年距离下一年剩余的天数*/
		if(year1%4==0&&year1%100!=0||year1%400==0){
			for(int i=0;i<month1;i++){
				days2[13]+=days2[i];
			}
			days2[13]+=day1;
			days2[13]=366-days2[13];
		}else{
			for(int i=0;i<month1;i++){
				days1[13]+=days1[i];
			}
			days1[13]+=day1;
			days1[13]=365-days1[13];
		}
		/*求较大日期当年已经度过的天数*/
		if(year2%4==0&&year2%100!=0||year2%400==0){
			for(int i=0;i<month2;i++){
				days2[13]+=days2[i];
			}
			days2[13]+=day2;
		}else{
			for(int i=0;i<month2;i++){
				days1[13]+=days1[i];
			}
			days1[13]+=day2;			
		}
		count=countyears+days1[13]+days2[13];//累计和
		/*如果是求同一年两个日期之间的天数,用通过上面的方法求出的累加和减去当年总天数,求得两个日期之间的差值*/
		if(year1==year2){
			if(year2%4==0&&year2%100!=0||year2%400==0)
			{
				count=count-366;
			}else{
				count=count-365;
			}
			if(count<0){
				count=-count;
			}
		}
		System.out.println("*****求两个日期之间的天数******");
		System.out.print(year1+"年"+month1+"月"+day1+"日~"+year2+"年"+month2+"月"+day2+"日共有:");
		System.out.println(count+"天");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值