Java 题目天数计算 就这样

在这个用户管理系统中,可以显示你首次登陆后到今天的天数,假设当前日期为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]);
        /////////////////////  算法开始    ///////////////////////////////
        /*
          算法思路:计算给定日期到031日的天数,然后相减,获取间隔天数
           m1=(startMonth+9) % 12  是用来判断是否大于3月,因为2月是闰年的标识
           y1=startYear - m1/10    如果是1月和2月,则不包括当前年份(因为是计算031日的天数)
           365 * y1                表示不算闰年多出的一天其余天数的总和
           y1/4 - y1/100 +y1/400   表示加上所有闰年多出的一天,其实就是计算有几个闰年 4的倍数 - 100 的倍数 + 400 的倍数,和我们上面判断函数一样
           (m1*306+5)/10           计算当前月到31日间的天数,306=365-31-28(12月天数),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();
    }
}

img

img

package com.csdn;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class Solution {

    public static void main(String[] args) {
        // 测试用例1
        long daysDiff1 = get("2020-03-01", "1998-07-06");
        System.out.println("相隔天数为:" + daysDiff1);
        // 测试用例2
        long daysDiff2 = get("2020-03-01", "2008-10-11");
        System.out.println("相隔天数为:" + daysDiff2);
    }

    /**
     * 
     * @param currentDate  当前的日期
     * @param previousDate 以前的日期
     * @return 相隔天数
     */
    public static long get(String currentDate, String previousDate) {
        LocalDate startDate = LocalDate.parse(previousDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        LocalDate endDate = LocalDate.parse(currentDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
        return daysDiff;
    }

}

img

使用JDK1.8的新特性localDate、localTime实现或使用hutool工具包的DateUtil实现