mitsushima46 2021-09-23 19:12 采纳率: 100%
浏览 257
已结题

Java 题目天数计算 就这样

在这个用户管理系统中,可以显示你首次登陆后到今天的天数,假设当前日期为2020年3月1日,输入你的首次登陆时间(yyyy-mm-dd格式),输出本系统已经陪您度过了多少天?(注意闰年和平年,不能使用Date类)

【测试用例1】

输入:1998-07-06
输出:本系统已经陪您度过了7909天

【测试用例2】

输入:2008-10-11
输出:本系统已经陪您度过了4159天

  • 写回答

3条回答 默认 最新

  • 广大菜鸟 2021-09-23 21:17
    关注
    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月3日
  • 已采纳回答 9月25日
  • 创建了问题 9月23日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。