- 问题描述
这个问题主要是熟练使用类,练习类的有关知识点,理解构造方法在类中的作用,学会 调用对象的方法和属性,理解this关键字的作用。
2.问题分析
要完成天数的计算,首先得要规定年份,月份,天数的范围,年可以根据实际情况去规定,每年有12月份,每个月有不同的天数,这里可以把每个月份的天数按照顺序使用一个数组保存起来,使用下标直接访问。但是在判断天数里有一个特殊情况就是二月份的天数在闰年是29天,在非闰年是28天,这里还得判断是否是闰年。接下来就是之后天数和之前天数的计算,这里一个月一个月来计算,当天数大于每个月的天数时 ,月份加一,再减去这个月份的天数,当月份大于12的时候,就说明这个时候成为一月,相应的年份也应该加一。而计算之前日期的时候则相反,判断的条件变为小于零。
public class Date {
private int year;
private int month;
private int day;
private static int[] dayOfMonth={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public Date()
{
int year=0;
int month=0;
int day=0;
}
public Date(int year,int month,int day)
{
if(year<1880||year>2020)
{
System.err.println("年份输入有误");
return;
}
if(month<1||month>12)
{
System.err.println("月份输入有误");
return;
}
if(day<1||day>judgeDayOfMonth(year,month))
{
System.err.println("天数输入有误");
return;
}
this.year=year;
this.month=month;
this.day=day;
}
public int judgeDayOfMonth(int year, int month) {
if (month != 2) {
return dayOfMonth[month - 1];
}
if (isLeapYear(year))
{
return 29;
}
else
return 28;
}
public static boolean isLeapYear(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return true;
}
else
{
return false;
}
}
// public Date dateAfter(int day1)
// {
// day+=day1;
// while(day>judgeDayOfMonth( year, month))
// {
// day=day-judgeDayOfMonth( year, month);
// month+=1;
// if(month>12)
// {
// month=1;
// year=year+1;
// }
// }
// return this;
// }
public Date dateAfter(int days) {
Date t=new Date(year,month,day);
t.day += days;
while (t.day > judgeDayOfMonth(year, month)) {
t.day -= judgeDayOfMonth(year, month);
t.month += 1;
if (t.month > 12) {
t.month = 1;
t.year += 1;
}
}
return t;
}
// public Date dateBefore(int day1)
// {
// day-=day1;
// while(day<0)
// {
// day=day+judgeDayOfMonth( year, month);
// month=month-1;
// if(month<1)
// {
// month=month+12;
// year=year-1;
// }
// }
// return this;
// }
public Date dateBefore(int days) {
Date t=new Date(year,month,day);
t.day-=days;
while (t.day <0) {
t.day += judgeDayOfMonth(year, month);
t.month -= 1;
if(t.month<1)
{
t.month=12;
t.year-=1;
}
}
return t;
}
public int dayOfYear(int year)
{
if(isLeapYear(year))
{
return 366;
}
else
{
return 365;
}
}
public int diff(Date a, Date c) {
Date b=new Date (year,month,day);
int n1=(a.year)*(a.dayOfYear(year))+(a.month)*(a.judgeDayOfMonth(year,month))+(a.day);
int n2=(b.year)*(b.dayOfYear(year))+(b.month)*(b.judgeDayOfMonth(year,month))+(b.day);
int days=n2-n1;
return days;
}
public String toString() {
return String.format("%04d-%02d-%02d", year, month, day);
}
public static void main(String[] args) {
Date d = new Date(2019,7,20);
Date d2=new Date(2019,7,22);
System.out.println(d2.toString());
int n=d2.diff(d,d2);
System.out.println(n);
System.out.println(d2.toString());
// Date r = d.dateAfter(731);
// Date f=d1.dateBefore(1000);
// System.out.println(r.toString());
// System.out.println(f.toString());
}
}