pta 7-1 日期类设计 (30 分)两个日期之间相隔天数_7-1 计算天数pta-程序员宅基地

技术标签: java  error  pta  

比上一次时间复杂性低了点

在这里插入图片描述

最最终代码,真的不写了,可以直接cop

import java.util.Scanner;
public class Main {
    

    private int year;
    private int month;
    private int day;
    public boolean checkInputValidity()//检测输入的年、月、日是否合法
    {
    
        if(this.year<1820||this.year>2020||this.month<1||this.month>12||this.day<1||this.day>31){
    
            return false;
        }
        else {
    
            if(isLastDays(this.year,this.month)==30){
    
                if(this.day>=31){
    
                    return false;
                }
            }
            if(this.month == 2){
    
                if(isLeapYear(this.year)){
    
                    if(this.day>29){
    
                        return false;
                    }
                }
                else{
    
                    if(this.day>28){
    
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public boolean isLeapYear(int year)//判断year是否为闰年
    {
    
        if((year%400)==0||((year%4)==0&&(year%100)!=0)){
    //if((year%100)!=0&&(year%4)==0){
    
            return true;
        }
        else {
    
            return false;
        }
    }

    public Main getNextNDays(int add_days)//取得year-month-day的下n天日期
    {
    
        Main temp_date=new Main(this);
        if(add_days==0)return temp_date;

        while (add_days>366&&temp_date.day<29){
    //有的月只有28天,往下一年跳会出届
            add_days-=NextYear(temp_date.year,temp_date.month);
            temp_date.year++;
        }
        while (add_days>=31&&temp_date.day<29){
    
            add_days-=isLastDays(temp_date.year,temp_date.month);
            temp_date=nextMonth(temp_date);
        }

        while(true)	//死循环
        {
    
            temp_date = nextDay(temp_date);	//计算下一天
            add_days--;						//要增加的天数--
            if(add_days <= 0)				//当要增加的天数等于0时,停止循环
                break;
        }
            
        return temp_date;
    }

    private int NextYear(int year, int month) {
    
        if(isLeapYear(year)){
    
            if(month<=2){
    
                return 366;
            }
            else return 365;
        }
        else {
    
            if(isLeapYear(year+1)){
    
                if(month<=2)return 365;
                else return 366;
            }
            else return 365;
        }

    }

    private Main nextMonth(Main date) {
    
        date.month++;									//月份++
        if(date.month == 13)							//如果是年底
        {
    
            date.month = 1;							//那么月份置为1
            date.year++;								//年份加1
        }
        return date;
    }

    public Main nextDay(Main date)		//计算下一天
    {
    
        if(date.day == isLastDays(date.year,date.month))	//如果是月底
        {
    
            date.day = 1;									//那么下一天则置天数为1
            date=nextMonth(date);
        }
        else												//如果不是月底,天数加一即可
            date.day++;
        return date;
    }
    public int isLastDays(int year,int month)	//返回对应月份的天数
    {
    
        if(isLeapYear(year) && month == 2){
    
            //System.out.println("闰年!");
            return 29;
        }
        if(month == 2){
    
            //   System.out.println("平2月!");
            return 28;}
        if(month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        return 31;
    }
    public Main getPreviousNDays(int dec_days)//取得year-month-day的前n天日期
    {
    
        Main temp_date=new Main(this);
        if(dec_days==0)return temp_date;

        while (dec_days>366&&temp_date.day<29){
    
            dec_days-=LastYear(temp_date.year,temp_date.month);
            temp_date.year--;
        }
        while (dec_days>31&&temp_date.day<29){
    
            dec_days-=isStartDays(temp_date.year,temp_date.month);
            temp_date=nextPMonth(temp_date);
        }

        while(true)	//死循环
        {
    
            temp_date = lastDay(temp_date);	//计算下一天
            dec_days--;						//要增加的天数--
            if(dec_days <= 0)					//当要增加的天数等于0时,停止循环
                break;
        }
        return temp_date;
    }

    private int LastYear(int year, int month) {
    
        if(isLeapYear(year)){
    
            if(month<=2)return 365;
            else return 366;
        }
        else {
    
            if(isLeapYear(year-1)){
    
                if(month<=2)return 366;
                else return 365;
            }
            else return 365;
        }
    }

    private Main nextPMonth(Main date) {
    
        date.month--;									//月份++
        if(date.month == 0)							//如果是年底
        {
    
            date.month = 12;							//那么月份置为1
            date.year--;								//年份加1
        }
        return date;
    }

    private Main lastDay(Main date) {
    
        if(date.day == 1)	//如果是月底
        {
    
            date.day = isStartDays(date.year,date.month);									//那么下一天则置天数为1
            date=nextPMonth(date);
        }
        else												//如果不是月底,天数加一即可
            date.day--;
        return date;
    }
    private int isStartDays(int year, int month) {
    
        if(isLeapYear(year) && month == 3){
    
            //System.out.println("闰年闰月!");
            return 29;}
        if(month == 3)
            return 28;
        if(month == 4 || month == 6 || month == 9 || month == 11||month==1||month==8||month==2)
            return 31;
        return 30;
    }
    public boolean compareDates(Main date)//比较当前日期与date的大小(先后)
    {
    
        while (!equalTwoDates(date)){
    
            if(this.year>date.year) return true;
            else if (this.year<date.year)return false;
            else
            {
    
                if(this.month>date.month) return true;
                else if(this.month<date.month) return false;
                else {
    
                    if(this.day>date.day) return true;
                    else return false;
                }
            }
        }
        return false;

    }
    public boolean equalTwoDates(Main date)//判断两个日期是否相等
    {
    
        if(this.day==date.day&&this.year==date.year&&this.month==date.month){
    
            return true;
        }
        else {
    
            return false;
        }
    }
    public int getDaysofDates(Main date)//求当前日期与date之间相差的天数
    {
    
        if(this.equalTwoDates(date)){
    
            return 0;
        }
        else {
    
            if(this.compareDates(date)){
    
                boolean flag=true;int i=1;
                i=iStart(date);
                while (flag){
    
                    if(this.getPreviousNDays(i).equalTwoDates(date)){
    
                        flag =false;
                        return i;
                    }
                    i++;
                }
            }
            else {
    
                boolean flag=true;int i=1;
                i=iStart(date);
                while (flag){
    //不要把int i=1;放里边
                    if(this.getNextNDays(i).equalTwoDates(date)){
    
                        flag =false;
                        return i;
                    }
                    i++;
                }
            }
        }
        return 0;
    }
    private int iStart(Main date) {
    //确定i的初始值减少运行时间开销
        int i=0;
        if(this.year==date.year&&this.month==date.month){
    
            return 1;
        }
        else if(this.year==date.year){
    

            if(this.month>date.month){
    
                i=(this.month-date.month-1)*28+1;
                return i;
            }
            else {
    

                i=(date.month-this.month-1)*28+1;
                return i;
            }
        }
        else {
    

            if(this.year>date.year){
    
                i=((this.year-date.year-1)*365);
                return i;
            }
            else {
    
                i=((date.year-this.year-1)*365);
                return i;
            }
        }

    }
    public String showDate()//以“year-month-day”格式返回日期值
    {
    
        return year + "-" + month + "-" + day;
    }

    public Main() {
    
    }
    public Main(int year, int month, int day) {
    
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public Main(Main date) {
    
        this(date.year, date.month, date.day);
    }
    public int getYear() {
    
        return year;
    }

    public int getMonth() {
    
        return month;
    }

    public int getDay() {
    
        return day;
    }

    public static void main(String[] args) {
    
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) {
     // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            Main date = new Main(year, month, day);

            if (!date.checkInputValidity()) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) {
     // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            Main date = new Main(year, month, day);

            if (!date.checkInputValidity()) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {
        //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            Main fromDate = new Main(year, month, day);
            Main toDate = new Main(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
    
                System.out.println("The days between " + fromDate.showDate() +
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
    
            System.out.println("Wrong Format");
            System.exit(0);
        }
    }

}


bug几乎都踩过了,安全可放心食用

当悲伤逆流成河

写了4天!想他么多写点代码完成感悟,但是我没力气了,”类“!我一直以为是哪里错了呢?我以为是他么(文明)getNextNDays()那两个方法时间优化错了,结果是特么我没有写,0天后是几号!!啊!!不说了,700ms那里我换可以优化一下,但是我就不,别问!问就是玩!
算了,我还是优化一下吧,毕竟哎,肝了四天,我先喘口气!!!
在这里插入图片描述

最终版代码

import java.util.Scanner;
public class Main {
    

    private int year;
    private int month;
    private int day;
    public boolean checkInputValidity()//检测输入的年、月、日是否合法
    {
    
        if(this.year<1820||this.year>2020||this.month<1||this.month>12||this.day<1||this.day>31){
    
            return false;
        }
        else {
    
            if(isLastDays(this.year,this.month)==30){
    
                if(this.day>=31){
    
                    return false;
                }
            }
            if(this.month == 2){
    
                if(isLeapYear(this.year)){
    
                    if(this.day>29){
    
                        return false;
                    }
                }
                else{
    
                    if(this.day>28){
    
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public boolean isLeapYear(int year)//判断year是否为闰年
    {
    
        if((year%400)==0||((year%4)==0&&(year%100)!=0)){
    //if((year%100)!=0&&(year%4)==0){
    
            return true;
        }
        else {
    
            return false;
        }
    }

    public Main getNextNDays(int add_days)//取得year-month-day的下n天日期
    {
    
        Main temp_date=new Main(this);
        if(add_days==0)return temp_date;

        while(true)	//死循环
        {
    
            if(add_days>31&&temp_date.day<29){
    
                add_days-=isLastDays(temp_date.year,temp_date.month);
                temp_date=nextMonth(temp_date);
            }

            temp_date = nextDay(temp_date);	//计算下一天
            add_days--;						//要增加的天数--
            if(add_days <= 0)					//当要增加的天数等于0时,停止循环
                break;
        }
        return temp_date;
    }

    private Main nextMonth(Main date) {
    
        date.month++;									//月份++
        if(date.month == 13)							//如果是年底
        {
    
            date.month = 1;							//那么月份置为1
            date.year++;								//年份加1
        }
        return date;
    }

    public Main nextDay(Main date)		//计算下一天
    {
    
        if(date.day == isLastDays(date.year,date.month))	//如果是月底
        {
    
            date.day = 1;									//那么下一天则置天数为1
            date=nextMonth(date);
        }
        else												//如果不是月底,天数加一即可
            date.day++;
        return date;
    }
    public int isLastDays(int year,int month)	//返回对应月份的天数
    {
    
        if(isLeapYear(year) && month == 2){
    
            //System.out.println("闰年!");
            return 29;
        }
        if(month == 2){
    
            //   System.out.println("平2月!");
            return 28;}
        if(month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        return 31;
    }
    public Main getPreviousNDays(int dec_days)//取得year-month-day的前n天日期
    {
    
        Main temp_date=new Main(this);
        if(dec_days==0)return temp_date;
        while(true)	//死循环
        {
    
            if(dec_days>31&&temp_date.day<29){
    
                dec_days-=isStartDays(temp_date.year,temp_date.month);
                temp_date=nextPMonth(temp_date);
            }
            temp_date = lastDay(temp_date);	//计算下一天
            dec_days--;						//要增加的天数--
            if(dec_days <= 0)					//当要增加的天数等于0时,停止循环
                break;

        }


        return temp_date;
    }

    private Main nextPMonth(Main date) {
    
        date.month--;									//月份++
        if(date.month == 0)							//如果是年底
        {
    
            date.month = 12;							//那么月份置为1
            date.year--;								//年份加1
        }
        return date;
    }

    private Main lastDay(Main date) {
    
        if(date.day == 1)	//如果是月底
        {
    
            date.day = isStartDays(date.year,date.month);									//那么下一天则置天数为1
            date=nextPMonth(date);
        }
        else												//如果不是月底,天数加一即可
            date.day--;
        return date;
    }
    private int isStartDays(int year, int month) {
    
        if(isLeapYear(year) && month == 3){
    
            //System.out.println("闰年闰月!");
            return 29;}
        if(month == 3)
            return 28;
        if(month == 4 || month == 6 || month == 9 || month == 11||month==1||month==8||month==2)
            return 31;
        return 30;
    }
    public boolean compareDates(Main date)//比较当前日期与date的大小(先后)
    {
    
        while (!equalTwoDates(date)){
    
            if(this.year>date.year) return true;
            else if (this.year<date.year)return false;
            else
            {
    
                if(this.month>date.month) return true;
                else if(this.month<date.month) return false;
                else {
    
                    if(this.day>date.day) return true;
                    else return false;
                }
            }
        }
        return false;

    }
    public boolean equalTwoDates(Main date)//判断两个日期是否相等
    {
    
        if(this.day==date.day&&this.year==date.year&&this.month==date.month){
    
            return true;
        }
        else {
    
            return false;
        }
    }
    public int getDaysofDates(Main date)//求当前日期与date之间相差的天数
    {
    
        if(this.equalTwoDates(date)){
    
            return 0;
        }
        else {
    
            if(this.compareDates(date)){
    
                boolean flag=true;int i=1;
                i=iStart(date);
                // System.out.println(i);
                while (flag){
    
                    if(this.getPreviousNDays(i).equalTwoDates(date)){
    
                        flag =false;
                        return i;
                    }
                    i++;
                }
            }
            else {
    
                boolean flag=true;int i=1;
                i=iStart(date);
                //System.out.println(i+"xiao");
                while (flag){
    //不要把int i=1;放里边
                    if(this.getNextNDays(i).equalTwoDates(date)){
    
                        flag =false;
                        return i;
                    }
                    i++;
                }
            }
        }
        return 0;
    }
    private int iStart(Main date) {
    //确定i的初始值减少运行时间开销
        int i=0;
        if(this.year==date.year&&this.month==date.month){
    
            return 1;
        }
        else if(this.year==date.year){
    

            if(this.month>date.month){
    
                i=(this.month-date.month-1)*28+1;
                return i;
            }
            else {
    

                i=(date.month-this.month-1)*28+1;
                return i;
            }
        }
        else {
    

            if(this.year>date.year){
    
                i=((this.year-date.year-1)*365);
                return i;
            }
            else {
    
                i=((date.year-this.year-1)*365);
                return i;
            }
        }

    }
    public String showDate()//以“year-month-day”格式返回日期值
    {
    
        return year + "-" + month + "-" + day;
    }

    public Main() {
    
    }
    public Main(int year, int month, int day) {
    
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public Main(Main date) {
    
        this(date.year, date.month, date.day);
    }
    public int getYear() {
    
        return year;
    }

    public int getMonth() {
    
        return month;
    }

    public int getDay() {
    
        return day;
    }

    public static void main(String[] args) {
    
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) {
     // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            Main date = new Main(year, month, day);

            if (!date.checkInputValidity()) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) {
     // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            Main date = new Main(year, month, day);

            if (!date.checkInputValidity()) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {
        //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            Main fromDate = new Main(year, month, day);
            Main toDate = new Main(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
    
                System.out.println("The days between " + fromDate.showDate() +
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
    
            System.out.println("Wrong Format");
            System.exit(0);
        }
    }

}


有大佬这样解决java在pta交不了的问题:

PTA上提交Java程序的一些套路

有这种运行超时的怎么解决?

答:等等。
在这里插入图片描述

在这里插入图片描述

pta题目

参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值

应用程序共测试三个功能:

求下n天
求前n天
求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)

程序主方法如下:
下面展示一些 内联代码片

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
    
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) {
     // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) {
     // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {
        //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
    
                System.out.println("The days between " + fromDate.showDate() + 
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
    
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
    
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}

在idea上能运行但是在pta上就会这样:

在这里插入图片描述
有大佬这样解决:
PTA上提交Java程序的一些套路

我写的代码:

其中所有的DateUtil都需要改成Main才不会编译错误,之后我就不知道该怎么办了(哭.jpg)

import java.util.Scanner;

public class DateUtil {
    

    private int year;
    private int month;
    private int day;
    public boolean checkInputValidity()//检测输入的年、月、日是否合法
    {
    
        if(this.year<1820||this.year>2020||this.month<1||this.month>12||this.day<1||this.day>31){
    
            return false;
        }
        else {
    
            return true;
        }
    }
    public boolean isLeapYear(int year)//判断year是否为闰年
    {
    
        if((year%400)==0||((year%4)==0&&(year%100)!=0)){
    //if((year%100)!=0&&(year%4)==0){
    
            return true;
        }
        else {
    
            return false;
        }
    }
    public DateUtil getNextNDays(int add_days)//取得year-month-day的下n天日期
    {
    
        DateUtil temp_date=new DateUtil(this);

        while (add_days/366==0){
    
            add_days=yStart(temp_date,add_days);
            temp_date.year++;
        }
        while (add_days/31==0){
    
            add_days=mStart(temp_date,add_days);
            temp_date.month++;
        }
        while(true)	//死循环
        {
    
            temp_date = nextDay(temp_date);	//计算下一天
            add_days--;						//要增加的天数--
            if(add_days == 0)					//当要增加的天数等于0时,停止循环
                break;
        }
        return temp_date;
    }

    private int mStart(DateUtil temp_date, int add_days) {
    
        temp_date.month++;
        if(isLastDays(temp_date.year,temp_date.month)==31)
            return add_days-31;
        else if(isLastDays(temp_date.year,temp_date.month)==30)
            return add_days-30;
        else if(isLastDays(temp_date.year,temp_date.month)==28)
        return add_days-28;
        else return add_days-29;
    }
    private int yStart(DateUtil temp_date,int n) {
    
        //存在问题
        if(temp_date.isLeapYear(++temp_date.year)){
    
            return n-366;
        }
        else {
    
            return n-365;
        }
    }


    public DateUtil nextDay(DateUtil date)		//计算下一天
    {
    
        if(date.day == isLastDays(date.year,date.month))	//如果是月底
        {
    
            date.day = 1;									//那么下一天则置天数为1
            date.month++;									//月份++
            if(date.month == 13)							//如果是年底
            {
    
                date.month = 1;							//那么月份置为1
                date.year++;								//年份加1
            }
        }
        else												//如果不是月底,天数加一即可
            date.day++;
        return date;
    }
    public int isLastDays(int year,int month)	//返回对应月份的天数
    {
    
        if(isLeapYear(year) && month == 2){
    
            //System.out.println("闰年!");
            return 29;
        }
        if(month == 2){
    
         //   System.out.println("平2月!");
            return 28;}
        if(month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        return 31;
    }
    public DateUtil getPreviousNDays(int dec_days)//取得year-month-day的前n天日期
    {
    
        DateUtil temp_date=new DateUtil(this);
        while (dec_days/366==0){
    
            dec_days=yPStart(temp_date,dec_days);
            temp_date.year--;
        }
        while (dec_days/31==0){
    
            dec_days=mPStart(temp_date,dec_days);
            temp_date.month--;
        }

        while(true)	//死循环
        {
    
            temp_date = lastDay(temp_date);	//计算下一天
            dec_days--;						//要增加的天数--
            if(dec_days == 0)					//当要增加的天数等于0时,停止循环
                break;
        }
        return temp_date;
    }

    private int mPStart(DateUtil temp_date, int add_days) {
    
        temp_date.month--;
        if(isLastDays(temp_date.year,temp_date.month)==31)
            return add_days-31;
        else if(isLastDays(temp_date.year,temp_date.month)==30)
            return add_days-30;
        else if(isLastDays(temp_date.year,temp_date.month)==28)
            return add_days-28;
        else return add_days-29;
    }

    private int yPStart(DateUtil temp_date, int n) {
    
        if(temp_date.isLeapYear(--temp_date.year)){
    
            return n-366;
        }
        else {
    
            return n-365;
        }
    }


    private DateUtil lastDay(DateUtil date) {
    
        if(date.day == 1)	//如果是月底
        {
    
            date.day = isStartDays(date.year,date.month);									//那么下一天则置天数为1
            date.month--;									//月份++
            if(date.month == 0)							//如果是年底
            {
    
                date.month = 12;							//那么月份置为1
                date.year--;								//年份加1
            }
        }
        else												//如果不是月底,天数加一即可
            date.day--;
        return date;
    }
    private int isStartDays(int year, int month) {
    
        if(isLeapYear(year) && month == 3){
    
            //System.out.println("闰年闰月!");
            return 29;}
        if(month == 3)
            return 28;
        if(month == 4 || month == 6 || month == 9 || month == 11||month==1||month==8||month==2)
            return 31;
        return 30;
    }
    public boolean compareDates(DateUtil date)//比较当前日期与date的大小(先后)
    {
    
        if(this.year>date.year){
    
            return true;
        }
        else if(this.year==date.year){
    
            if(this.month>date.month){
    
                return true;
            }
            else if(this.month==date.month){
    
                if(this.day>date.day){
    
                    return true;
                }
                else if(this.day==date.day){
    
                    return false;
                }
                else {
    
                    return false;
                }
            }
            else {
    
                return false;
            }
        }
        else {
    
            return false;
        }
    }
    public boolean equalTwoDates(DateUtil date)//判断两个日期是否相等
    {
    
        if(this.day==date.day&&this.year==date.year&&this.month==date.month){
    
            return true;
        }
        else {
    
            return false;
        }
    }
    public int getDaysofDates(DateUtil date)//求当前日期与date之间相差的天数
    {
    


        if(this.equalTwoDates(date)){
    
            return 0;
        }
        else {
    
            if(this.compareDates(date)){
    
                boolean flag=true;int i=1;
                i=iStart(date);
                while (flag){
    
                    //System.out.println("大!");
                    //System.out.println(this.getPreviousNDays(i).showDate());
                    if(this.getPreviousNDays(i).equalTwoDates(date)){
    
                        flag =false;
                        return i;
                    }
                   i++;
                }
            }
            else {
    
                boolean flag=true;int i=1;
                i=iStart(date);
                while (flag){
    //不要把int i=1;放里边
                    // System.out.println("小!");
                    if(this.getNextNDays(i).equalTwoDates(date)){
    
                        flag =false;
                        return i;
                    }
                    i++;
                }
            }
        }
    return 0;
    }
    private int iStart(DateUtil date) {
    //确定i的初始值减少运行时间开销
        int i=0;
            if(this.year>date.year){
    
                i+=(this.year-date.year-1)*365;
                if(this.month>date.month){
    
                    i+=(this.month-date.month-1)*28;
                    return i;
                }
                else if(this.month<date.month){
    
                    i+=(this.month-date.month+11);
                    return i;
                }
                return i;
            }
            else if(this.year==date.year){
    
                if(this.month>date.month){
    
                    i+=(this.month-date.month-1)*28;
                    if(this.day>date.day){
    
                        i+=(this.day-date.day-1);
                        return i;
                    }
                    else if(this.day<date.day){
    
                        i+=(this.day-date.day+27);
                        return i;
                    }
                   return i;
                }
            }
            else if(this.year==date.year){
    
                if(this.month==date.month){
    
                    if(this.day>date.day){
    
                        i+=(this.day-date.day-1);
                        return i;
                    }
                    else if(this.day<date.day){
    
                        i+=(this.day-date.day+27);
                        return i;
                    }
                }
                return i;
            }
        else {
    
             //   System.out.println("再调用!!!");
            return date.iStart(this);
        }
        return i;
    }

    public String showDate()//以“year-month-day”格式返回日期值
    {
    
        String s ="";
        s+= this.year;
        s+="-";
        s+=this.month;
        s+="-";
        s+=this.day;
        return s;
    }

    public DateUtil() {
    
    }
    public DateUtil(int year, int month, int day) {
    
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public DateUtil(DateUtil date) {
    
        this(date.year, date.month, date.day);
    }
    public int getYear() {
    
        return year;
    }

    public int getMonth() {
    
        return month;
    }

    public int getDay() {
    
        return day;
    }

        public static void main(String[] args) {
    
            Scanner input = new Scanner(System.in);
            int year = 0;
            int month = 0;
            int day = 0;

            int choice = input.nextInt();

            if (choice == 1) {
     // test getNextNDays method
                int m = 0;
                year = Integer.parseInt(input.next());
                month = Integer.parseInt(input.next());
                day = Integer.parseInt(input.next());

                DateUtil date = new DateUtil(year, month, day);

                if (!date.checkInputValidity()) {
    
                    System.out.println("Wrong Format");
                    System.exit(0);
                }

                m = input.nextInt();

                if (m < 0) {
    
                    System.out.println("Wrong Format");
                    System.exit(0);
                }

                System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
                System.out.println(date.getNextNDays(m).showDate());
            } else if (choice == 2) {
     // test getPreviousNDays method
                int n = 0;
                year = Integer.parseInt(input.next());
                month = Integer.parseInt(input.next());
                day = Integer.parseInt(input.next());

                DateUtil date = new DateUtil(year, month, day);

                if (!date.checkInputValidity()) {
    
                    System.out.println("Wrong Format");
                    System.exit(0);
                }

                n = input.nextInt();

                if (n < 0) {
    
                    System.out.println("Wrong Format");
                    System.exit(0);
                }

                System.out.print(
                        date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
                System.out.println(date.getPreviousNDays(n).showDate());
            } else if (choice == 3) {
        //test getDaysofDates method
                year = Integer.parseInt(input.next());
                month = Integer.parseInt(input.next());
                day = Integer.parseInt(input.next());

                int anotherYear = Integer.parseInt(input.next());
                int anotherMonth = Integer.parseInt(input.next());
                int anotherDay = Integer.parseInt(input.next());

                DateUtil fromDate = new DateUtil(year, month, day);
                DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

                if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
    
                    System.out.println("The days between " + fromDate.showDate() +
                            " and " + toDate.showDate() + " are:"
                            + fromDate.getDaysofDates(toDate));
                } else {
    
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
            else{
    
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }

}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lovelry/article/details/120390245

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签