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

Java 题目天数计算 就这样

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

【测试用例1】

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

【测试用例2】

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

  • 写回答

4条回答 默认 最新

  • 广大菜鸟 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

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路