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