7-7 日期类设计

                      7-7 日期类设计

参考题目集二中和日期相关的程序,设计一个类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);
		}		
	}
}

输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):

1 year month day n //测试输入日期的下n天
2 year month day n //测试输入日期的前n天
3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
当输入有误时,输出格式如下: Wrong Format
当第一个数字为1且输入均有效,输出格式如下:
year1-month1-day1 next n days is:year2-month2-day2
当第一个数字为2且输入均有效,输出格式如下:
year1-month1-day1 previous n days is:year2-month2-day2
当第一个数字为3且输入均有效,输出格式如下:
The days between year1-month1-day1 and year2-month2-day2 are:值

输入样例1:
在这里给出一组输入。例如:

3 2014 2 14 2020 6 14

输出样例1:
在这里给出相应的输出。例如:

The days between 2014-2-14 and 2020-6-14 are:2312

AC代码:

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);
        }
    }
}


class DateUtil{
    private int year,month,day;
    public int vis[] = new int[20];

    public DateUtil(DateUtil d){
        this.day = d.getDay();
        this.month = d.getMonth();
        this.year = d.getYear();
        vis[1] = 31; vis[2] = 28; vis[3] = 31; vis[4] = 30; vis[5] = 31; vis[6] = 30;
        vis[7] = 31; vis[8] = 31; vis[9] = 30; vis[10] = 31; vis[11] = 30; vis[12] = 31;
    }

    public DateUtil(int y, int m, int d){
        year = y;
        month = m;
        day = d;
        vis[1] = 31; vis[2] = 28; vis[3] = 31; vis[4] = 30; vis[5] = 31; vis[6] = 30;
        vis[7] = 31; vis[8] = 31; vis[9] = 30; vis[10] = 31; vis[11] = 30; vis[12] = 31;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public int getDay() {
        return day;
    }

    public int getMonth() {
        return month;
    }

    public int getYear() {
        return year;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public void setYear(int year) {
        this.year = year;
    }
    public boolean checkInputValidity(){
        if(year < 1820 || year > 2020)
            return false;
        if(month < 1 || month > 12)
            return false;
        if(this.isLeapYear(this.getYear())){
            if(month == 2){
                if(day < 1 || day > 29)
                    return false;
            }
            else
            if(day < 1 || day > vis[month])
                return false;
        }
        if(!this.isLeapYear(this.year)){
            if(day<1 || day > vis[month])
                return false;
        }
        return true;
    }
    public boolean isLeapYear(int year){
        if(year % 400 == 0)
            return true;
        if(year % 4 == 0 && year % 100 != 0)
            return true;
        return false;
    }
    public DateUtil getNextNDays(int n){
        while(n > 365){
            if(this.isLeapYear(year) && month <= 2){
                if(month == 2 && day == 29){
                    day = 1;
                    month = 3;
                }
                year++;
                n = n - 366;
            }
            else if(this.isLeapYear(year+1) && month > 2){
                year++;
                n = n - 366;
            }
            else{
                year++;
                n = n - 365;
            }
        }
        for (int i = 0; i < n; i++) {
            day++;
            if(this.isLeapYear(year) && month == 2){
                if(day > 29){
                    month++;
                    day = 1;
                }
            }
            else if(day > vis[month]){
                month++;
                day = 1;
                if(month > 12){
                    month = 1;
                    year++;
                }
            }
        }
        return this;
    }
    public DateUtil getPreviousNDays(int n){
        DateUtil d = new DateUtil(this);
        while(n > 365){
            if(d.isLeapYear(d.getYear()) && d.getMonth() > 2){
                n = n - 366;
                d.setYear(d.getYear() - 1);
            }
            else if(d.isLeapYear(d.getYear() - 1) && d.getMonth() <= 2){
                n = n - 366;
                d.setYear(d.getYear() - 1);
            }
            else{
                n = n - 365;
                d.setYear(d.getYear() - 1);
            }
        }
        for(int i = 0; i < n; i++){
            d.setDay(d.getDay() - 1);
            if(d.getDay() <= 0){
                d.setMonth(d.getMonth() - 1);
                if(d.getMonth() <= 0){
                    d.setMonth(12);
                    d.setYear(d.getYear() - 1);
                }
                if(isLeapYear(d.getYear()) && d.getMonth() == 2)
                    d.setDay(29);
                else
                    d.setDay(d.vis[d.getMonth()]);
            }
        }
        return d;
    }
    public boolean compareDates(DateUtil date){
        if(this.year > date.getYear())
            return true;
        else if(this.year == date.getYear() && this.month > date.getMonth())
            return true;
        else if(this.year == date.getYear() && this.month == date.getMonth() && this.day > date.getDay())
            return true;
        return false;
    }
    public boolean equalTwoDates(DateUtil date){
        if(this.year != date.getYear())
            return false;
        else if(this.day != date.getDay())
            return false;
        else if(this.month != date.getMonth())
            return false;
        else
            return true;
    }
    public int getDaysofDates(DateUtil date){
        int res = 0;
        boolean b = this.compareDates(date);
        DateUtil d = new DateUtil(this);
        if(b){
            while(d.getYear() - date.getYear() >= 2){
                if(d.isLeapYear(d.getYear()) && d.getMonth() > 2)
                    res = res + 366;
                else if(d.isLeapYear(d.getYear() - 1) && d.getMonth() <= 2)
                    res = res + 366;
                else
                    res = res + 365;
                d.setYear(d.getYear() - 1);
            }
            while(true){
                if(d.equalTwoDates(date))
                    break;
                res++;
                d.setDay(d.getDay() - 1);
                if(d.getDay() <= 0){
                    d.setMonth(d.getMonth() - 1);
                    if(d.getMonth() <= 0){
                        d.setMonth(12);
                        d.setYear(d.getYear() - 1);
                    }
                    if(isLeapYear(d.getYear()) && d.getMonth() == 2)
                        d.setDay(29);
                    else
                        d.setDay(d.vis[d.getMonth()]);
                }
            }
        }
        else{
            while(date.getYear() - d.getYear() >= 2){
                if(d.isLeapYear(d.getYear()) && d.getMonth() <= 2)
                    res = res + 366;
                else if(d.isLeapYear(d.getYear() + 1) && d.getMonth() > 2)
                    res = res + 366;
                else
                    res = res + 365;
                d.setYear(d.getYear() + 1);
            }
            while(true){
                if(d.equalTwoDates(date))
                    break;
                res++;
                d.setDay(d.getDay() + 1);
                if(isLeapYear(d.getYear()) && d.getMonth() == 2){
                    if(d.getDay() > 29){
                        d.setMonth(d.getMonth() + 1);
                        d.setDay(1);
                    }
                }
                else if(d.getDay() > d.vis[d.getMonth()]){
                    d.setMonth(d.getMonth() + 1);
                    d.setDay(1);
                    if(d.getMonth() > 12){
                        d.setMonth(1);
                        d.setYear(d.getYear() + 1);
                    }
                }
            }
        }
        return res;
    }
    public String showDate(){
        return year + "-" + month + "-" + day;
    }
}

版权声明:本文为weixin_45529716原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。