在这个用户管理系统中,可以显示你首次登陆后到今天的天数,假设当前日期为2020年3月1日,输入你的首次登陆时间(yyyy-mm-dd格式),输出本系统已经陪您度过了多少天?(注意闰年和平年,不能使用Date类)
【测试用例1】
输入:1998-07-06
输出:本系统已经陪您度过了7909天
【测试用例2】
输入:2008-10-11
输出:本系统已经陪您度过了4159天
在这个用户管理系统中,可以显示你首次登陆后到今天的天数,假设当前日期为2020年3月1日,输入你的首次登陆时间(yyyy-mm-dd格式),输出本系统已经陪您度过了多少天?(注意闰年和平年,不能使用Date类)
【测试用例1】
输入:1998-07-06
输出:本系统已经陪您度过了7909天
【测试用例2】
输入:2008-10-11
输出:本系统已经陪您度过了4159天
import java.util.Scanner;
class Solution {
private boolean leapYear(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
}
private int totalDaysOfMonth(int year,int month){
assert month<=11 && month >=0;
int[]days={31,28,31,30,31,30,31,31,30,31,30,31};
if(month != 1 || !leapYear(year))
return days[month];
else
return 1 + days[month];
}
private int totalDaysOfYear(int year){
return leapYear(year)?366:365;
}
//靠判断是否为闰年,用年份之差计算
public void calculateTime(){
//////////////////// 数据处理 //////////////////////////////////
String today = "2020-3-1";//2021-9-23 - 2019-6-25 = 2-2-29
String[] nowDate = today.split("-");
int nowYear = Integer.parseInt(nowDate[0]),
nowMonth = Integer.parseInt(nowDate[1])-1,
nowDay = Integer.parseInt(nowDate[2]);
System.out.println("假设当前日期为2020年3月1日,输入你的首次登陆时间(yyyy-mm-dd格式)");
Scanner scanner = new Scanner(System.in);
String date = scanner.nextLine();//输入日期 //String date = "1998-07-06";
String[] startData = date.split("-");
int startYear = Integer.parseInt(startData[0]),
startMonth = Integer.parseInt(startData[1])-1,
startDay = Integer.parseInt(startData[2]);
//////////////////// 天数判断 //////////////////////////////////
assert startYear<=nowYear;
int result, oldMarginDays, newMarginDays;
if(startYear!=nowYear) {//不同年
oldMarginDays = totalDaysOfMonth(startYear, startMonth) - startDay;// 差多少天够一个月
for (int m = startMonth + 1; m < 12; m++)
oldMarginDays += totalDaysOfMonth(startYear, m);
newMarginDays = nowDay; //比上个月底多几天
for (int m = 0; m < nowMonth; m++)
newMarginDays += totalDaysOfMonth(nowYear, m);
result = oldMarginDays + newMarginDays;
// 加上[startYear+1,nowYear]之间闰年天数和平年天数
int y2 = nowYear-1;
int numOfLeapYears = (y2/4 - y2/100 + y2 / 400)-(startYear /4 - startYear /100 + startYear / 400 );// 计算闰年个数
result += numOfLeapYears * 366 + (nowYear-1-startYear-numOfLeapYears) * 365;
/* 或者最原始的方式
for (int y = startYear + 1; y < nowYear; y++) {
//System.out.println(y+" "+totalDaysOfYear(y));
result += totalDaysOfYear(y);
}
*/
} else if(startMonth!=nowMonth){// 同年不同月
assert nowMonth>=startMonth;
oldMarginDays = totalDaysOfMonth(startYear, startMonth) - startDay;// 差多少天够一个月
newMarginDays = nowDay; //比上个月底多几天
result = oldMarginDays + newMarginDays;
for(int m=startMonth+1;m< nowMonth;m++)
result += totalDaysOfMonth(nowYear, m);
}
else{
assert nowDay>=startDay;
result = nowDay - startDay;
}
System.out.println("本系统已经陪您度过了" + result + "天");
}
// 用算法公式实现
public void day_diff(){
//////////////////// 数据处理 //////////////////////////////////
String today = "2020-3-1";//2021-9-23 - 2019-6-25 = 2-2-29
String[] nowDate = today.split("-");
int nowYear = Integer.parseInt(nowDate[0]),
nowMonth = Integer.parseInt(nowDate[1]),
nowDay = Integer.parseInt(nowDate[2]);
System.out.println("假设当前日期为2020年3月1日,输入你的首次登陆时间(yyyy-mm-dd格式)");
Scanner scanner = new Scanner(System.in);
String date = scanner.nextLine();//输入日期
String[] startData = date.split("-");
int startYear = Integer.parseInt(startData[0]),
startMonth = Integer.parseInt(startData[1]),
startDay = Integer.parseInt(startData[2]);
///////////////////// 算法开始 ///////////////////////////////
/*
算法思路:计算给定日期到0年3月1日的天数,然后相减,获取间隔天数
m1=(startMonth+9) % 12 是用来判断是否大于3月,因为2月是闰年的标识
y1=startYear - m1/10 如果是1月和2月,则不包括当前年份(因为是计算0到3月1日的天数)
365 * y1 表示不算闰年多出的一天其余天数的总和
y1/4 - y1/100 +y1/400 表示加上所有闰年多出的一天,其实就是计算有几个闰年 4的倍数 - 100 的倍数 + 400 的倍数,和我们上面判断函数一样
(m1*306+5)/10 计算当前月到3月1日间的天数,306=365-31-28(1、2月天数),5是全年中不是31天月份的个数
(startDay-1) 用于计算当前日到1日的间隔天数
*/
int m1 = (startMonth+9) % 12;
int y1 = startYear - m1/10;
int d1 = 365 * y1 + y1/4 - y1/100 + y1 / 400 + (m1*306 + 5) / 10 + (startDay-1);
int m2 = (nowMonth+9)%12;
int y2 = nowYear - m2/10;
int d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306+5) / 10 + (nowDay-1);
System.out.println("本系统已经陪您度过了" + (d2-d1) + "天");
}
public static void main(String[]args){
Solution solution = new Solution();
solution.calculateTime();
solution.day_diff();
}
}