应用程序共测试三个功能:
1、求下n天
2、求前n天
3、求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
(浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙)
看到这里,那没有其他的办法,只能快乐地coding了
(思路和细节分析见代码)
Update:2022年10月3日
经计科2005班魏大哥提醒,样例一的天数少1天
已经在第120行代码修改
AC代码
import java.util.Scanner;
class DateUtil{
int year,month,day;
DateUtil(int a,int b,int c){
this.year=a;this.month=b;this.day=c;
}
public int getYear() {return year;}//获取数据元素
public int getMonth() {return month;}
public int getDay() {return day;}
public boolean checkInputValidity(){//检查日期是否合法:分两步
int f=1;//标记数组
if(this.year<1820||this.year>2020) f=0;//第一步1、判断年月日的范围
if(this.month<1||this.month>12) f=0;
if(this.day<1||this.day>31) f=0;
boolean f_run=true;//判断是否为闰年
int[] m=new int[15];int eryue=0;//月份数组
f_run=isLeapYear(this.year);//第二步2、判断day是否超过了这一月的总天数
if(f_run==true) eryue=29;//算每个月的天
else eryue=28;
m[1]=31;m[3]=31;m[4]=30;m[5]=31;m[6]=30;m[7]=31;m[8]=31;
m[9]=30;m[10]=31;m[11]=30;m[12]=31;
if(this.month==2) {if(this.day>eryue) f=0;}
else if(this.day>m[this.month]) f=0;
if(f==1) return true;//返回
return false;
}
public boolean isLeapYear(int year){//判断year是否为闰年
if((year%4==0&&year%100!=0)||(year%400==0)) return true;
return false;
}
public DateUtil getNextNDays(int n){//取得year-month-day的下n天日
int a=this.year,b=this.month,c=this.day;
while(n>0){//n不为0就一直往后算
if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
if(n<=(31-c)) {c+=n;n-=n;}
注意这里有几个地方需要注意
//1、当n除去当前这个月c的天数时,b需要加一
//2、当月份b为13时,需要把年份加一,并且把月份b置为1
else {n-=(31-c);c=0;b++;if(b==13){b=1;a++;}}
}else if(b==4||b==6||b==9||b==11){
if(n<=(30-c)) {c+=n;n-=n;}
else {n-=(30-c);c=0;b++;}
}else{
if(isLeapYear(a)==true){
if(n<=(29-c)) {c+=n;n-=n;}
else {n-=(29-c);c=0;b++;}
}else{
if(n<=(28-c)) {c+=n;n-=n;}
else {n-=(28-c);c=0;b++;}
}
}
}
DateUtil u=new DateUtil(a, b, c);
return u;
}
public DateUtil getPreviousNDays(int n){//取得year-month-day的前n天日
int a=this.year,b=this.month,c=this.day;
while(n>0){
if(n<=c) {c-=n;n-=n;}
else{
注意这里有几个地方需要注意
//1、当n除去当前这个月c的天数时,b需要减一
//2、当月份b为0时,需要把年份减一,并且把月份b置为12
//3、注意c的取值是根据b的前一个月(也即b-1)决定的
n-=c;b--;if(b==0){b=12;a--;}
if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
c=31;
}else if(b==4||b==6||b==9||b==11){
c=30;
}else{
if(isLeapYear(a)==true){c=29;}
else{c=28;}
}
}
}
DateUtil u=new DateUtil(a, b, c);
return u;
}
//这两个函数没用上,就没写(嘻嘻)
// public boolean compareDates(DateUtil date);//比较当前日期与date的大小
// public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date){//求当前日期与date之间相差的天
int t=0;
int[] m=new int[15];//计算每月的天
if(isLeapYear(this.year)==true) m[2]=29; else m[2]=28;
m[1]=31;m[3]=31;m[4]=30;m[5]=31;m[6]=30;m[7]=31;m[8]=31;
m[9]=30;m[10]=31;m[11]=30;m[12]=31;
//这里需要注意几种情况:
//1、两个日期同年不同月
//2、两个日期不同年不同月
//3、两个日期同年同月
if(this.year<date.year||this.month<date.month){//防止同一个月
if(this.month==1||this.month==3||this.month==5
||this.month==7||this.month==8||this.month==10||this.month==12){
t+=(31-this.day);
}else if(this.month==4||this.month==6||this.month==9||this.month==11){
t+=(30-this.day);
}else{
if(isLeapYear(this.year)) t+=(29-this.day);
else t+=(28-this.day);
}
}
if(this.year<date.year){//防止同一年
for(int i=this.month+1;i<=12;i++){t+=m[i];}
}
for(int i=this.year+1;i<=date.year-1;i++){
if(isLeapYear(i)) t+=366;
else t+=365;
}
if(this.year<date.year){
for(int i=1;i<=date.month-1;i++){t+=m[i];}
}
if(this.month==date.month&&this.year==date.year) t=date.day-this.day;
else t+=date.day;
return (t);
}
public String showDate(){
return this.year+"-"+this.month+"-"+this.day;
}
}//以下为题目所给的主函数,照抄就行
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);
}
}
}