解题思路
坐标轴辅助理解:
首先求两个日期之间完整的年份的天数。例如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+"天");
}
}