pta 7-1 日期类设计 (30 分)两个日期之间相隔天数

13 篇文章 0 订阅
1 篇文章 0 订阅

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

在这里插入图片描述

最最终代码,真的不写了,可以直接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);
            }
        }

}


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值