为什么这个方法总是返回零?

时间:2010-10-22 16:03:59

标签: java

我正在尝试创建一个Date()类,但是我认为我的变量可能无法正常工作或我打破了一些模糊的类规则?我得到的一个线索是在调试期间......它将我引导到“thread.Class”并显示以下代码:

private void exit() {
    if (group != null) {
        group.remove(this);
        group = null;
    }

我不确定这意味着什么。这是我第一次创建自己的课程。我认为这可能导致“System.out.println(today.daysTo(yearFromNow));”返回零。它也可能与我的一些变量的范围有关。我的教授告诉我们,我们应该使用私有变量,但他并不完全清楚,至少对我而言。这是我到目前为止的代码:

public class Date {

private int year;
private int month;
private int day;

public static void main(String[] args) {
    Date today       = new Date(2010,10,22);
    Date today2      = new Date(2010,10,22);
    Date yearFromNow = new Date(2011,10,22);
    System.out.println(today.daysTo(yearFromNow));
    System.out.println(today.getMonth());
    System.out.println(today.getYear());
    System.out.println(today.equals(today2));
    System.out.println(today.compareTo(yearFromNow));
    System.out.println(today.toString());
}

public Date (int year1, int month1, int day1){

    if (year1 <= 0 || month1 <= 0 || month1 > 12 || day1 <= 0 || day1 > 31){
        throw new IllegalArgumentException("Input a valid d/m/y.");
    }       
    year = year1;
    month = month1;
    day = day1;
}

//Modifies current date by adding specified number of days; Not completed yet.
public void addDays (int days){
    int numberOfDays = daysBeforeMonth(this.month, this.year)+this.day+days;
    if (numberOfDays <= 31){
        this.month = 1;
    }
}

//Returns number of days to specified date.
public int daysTo (Date d){
    int presentDate = dayOfYear(this.day, this.month, this.year);
    int futureDate  = dayOfYear(d.day, d.month, d.year);
    return (futureDate - presentDate);
}

//Returns the number of the month in specified Date;
public int getMonth(){
    return this.month;
}

//Returns the number of the year in specified Date;
public int getYear (){
    return this.year;
}

// Reports whether or not this and d represent the same date.
public boolean equals (Date d){
    return this.day == d.day &&
       this.month   == d.month &&
       this.year    == d.year;
}

// Returns negative if this is earlier than d, returns positive
// if this is later than d, and returns zero otherwise.
public int compareTo (Date d){
    if (this.month < d.month || this.day < d.day || this.year < d.year){
        return -1;
    }
    if (this.month > d.month || this.day > d.day || this.year > d.year){
        return 1;
    }
    else return 0;
}

// Converts this Date into string form, using the format
// mm/dd/yyyy, as in 07/22/2006.
public String toString (){
    String stringDate = month+"/"+day+"/"+year;
    return stringDate;
}

// takes an int year and tests whether year is divisble by 4, but
// not 100 OR if it's divisible by 400 => is leap year, else not.
public static boolean isLeapYear(int year) {
    if (year % 4 == 0 && year % 100 != 0) {
        return true;
    }

    else if (year % 400 == 0) {
        return true;
    }

    else {
        return false;
    }
}

//Returns how many days before a certain month, else returns 0.
public static int daysBeforeMonth(int month, int year) {
    int Feb = 28;
    if (isLeapYear(year) == true) {
        month = 29;
    }
    if (month == 1) {
        return 0;
    } else if (month == 2) {
        return 31;
    } else if (month == 3) {
        return Feb + 31;
    } else if (month == 4) {
        return Feb + 61;
    } else if (month == 5) {
        return Feb + 92;
    } else if (month == 6) {
        return Feb + 122;
    } else if (month == 7) {
        return Feb + 153;
    } else if (month == 8) {
        return Feb + 184;
    } else if (month == 9) {
        return Feb + 215;
    } else if (month == 10) {
        return Feb + 245;
    } else if (month == 11) {
        return Feb + 276;
    } else if (month == 12) {
        return Feb + 306;
    }

    else {
        return 0;
    }
}
//Returns how many days have passed in reference to a specific date.
public static int dayOfYear(int day, int month, int year){
    return daysBeforeMonth(month, year) + day;
}

}

如果有人可以请我向我解释我的逻辑错误在哪里会很棒!谢谢!

5 个答案:

答案 0 :(得分:3)

旁白:

if (isLeapYear(year) == true) {
    month = 29;
}

应该是:

if (isLeapYear(year) == true) {
    Feb = 29;
}

我想。

但我认为主要问题是你要比较两个日期的dayOfYear。

考虑1月1日的dayOfYear:

  • 2010-01-01:dayOfYear为1。
  • 2011-01-01:dayOfYear是1。

所以区别是0。

答案 1 :(得分:1)

下面

public int daysTo (Date d){
    int presentDate = dayOfYear(this.day, this.month, this.year);
    int futureDate  = dayOfYear(d.day, d.month, d.year);
    return (futureDate - presentDate);
}

您计算每个日期的日期 - 两者都相同,因为每个日期是10月22日(或11月22日?), [更新] 虽然来自不同年份 [/ update] - 然后返回差异,这显然为0.

此外,这里

public static int daysBeforeMonth(int month, int year) {
    int Feb = 28;
    if (isLeapYear(year) == true) {
        month = 29;
    }
    if (month == 1) {
        return 0;
    } else if ... {
    } else if (month == 12) {
        return Feb + 306;
    }
    else {
        return 0;
    }
}

您在闰年中将month更改为无效值,因此该方法将返回0.

我想您要设置Feb,而不是month

(顺便说一下Java约定是用小写启动变量名。)

答案 2 :(得分:1)

daysTo()中,您可以计算当前日期和目标日期的日期编号。你用这些年来检查闰年。

您得到0的结果,因为您在2010年和2011年的两天中有一年中的相同日期。您还应该考虑日期的年份数。

答案 3 :(得分:0)

我认为这个问题是它倒圆了,年份是364.25天。这意味着您的门槛要到365天才会被击中。看看Joda时间。

答案 4 :(得分:0)

这里存在一个逻辑问题:

您的daysTo()函数使用您的dayOfYear()函数,该函数仅与该年有关。相隔1年的两天将返回相同的dayOfYear()值,减去将给出0。

要解决这个问题,你可以制作一个从UNIX纪元(1970年1月1日)开始几天的方法并比较它们。

另外以编程方式获取当前日期(而不是手动设置today),使用System.getCurrentTimeMillis()从UNIX纪元获取毫秒,然后只需将天数除以并将它们添加到1/1 / 1970。