目录
比上一次时间复杂性低了点
最最终代码,真的不写了,可以直接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题目
参考题目集二中和日期相关的程序,设计一个类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);
}
}
}