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

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签