2010-10-22 2 views
0

Я пытаюсь создать класс 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; 
} 

} 

Если кто-то может объяснить, пожалуйста, мне, где я неправильно в моей логике это было бы здорово! Благодаря!

+1

@RD мне кажется, что он разрешает только 1..12. –

+0

Мех, ты прав. –

ответ

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

рассчитать день года для каждого даты - , которые будут одинаковыми для обоих, так как каждая дата 22 октября (или 22 ноября?) [обновление] хотя и с разных лет [/ обновление] - затем вернуть разницу, которая, очевидно, 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.

(Btw конвенция Java, чтобы начать имена переменных в нижнем регистре.)

+0

Возможно, я смущен, но что делает февраль + 306? 364- 59 = 305 – Woot4Moo

+0

@ Downvoter, позаботьтесь, чтобы объяснить? –

+0

@ Woot4Moo, зачем спрашивать меня? Это копия прямо из OP :-) –

0

Я думаю, проблема в том, что она округляется, год составляет 364,25 дней. Это означает, что ваш порог не будет удален до 365 дней. Взгляните на Joda раз.

+0

Предполагаю, что OP должен написать свой собственный класс, а не использовать готовую библиотеку. –

+0

Я согласен с тем, что это скорее всего назначение OP. Однако от мудрого выбора не следует смотреть на правильно реализованный календарь для целей педагогики. – Woot4Moo

+0

Также вы можете создать дату для 2010-02-31, что немного странно. –

3

Помимо:

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

должно быть:

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

я думаю.

Но я думаю, что основная проблема заключается в том, что вы сравниваете dayOfYear для двух дат.

Рассмотрим DayOfYear на 1 января:

  • 2010-01-01: DayOfYear равен 1.
  • 2011-01-01: DayOfYear является 1.

Таким образом, разница составляет 0

+0

все, что считал его объект Date, должен знать, если его високосный год, который удалит ненужный вызов 'isLeapYear (год)' – Woot4Moo

+0

. Когда ваша отладка я нахожу лучше начать с несвязанных данных (Даты), например, 1 января 2010 года и 15 июня 2011 года, день/месяц/год не связаны. И затем попробуйте использовать специальные случаи, например, ровно 1 год или високосные годы и т. Д. – Valchris

+0

@ Valchris Вы не думаете, что было бы лучше начать (скажем) 2010-01-01 - 2010-01-02, и работать с там? Сначала проверьте самый короткий путь? –

1

В daysTo() Вы подсчитываете номер дня текущей даты и даты назначения. Вы используете годы, чтобы проверить високосные годы.

Вы получаете результат 0, потому что ваши два дня в 2010 и 2011 годах имеют номер в тот же день в году. Вы также должны учитывать количество летних дат.

0

Существует логическая проблема здесь:

Ваш daysTo() функция использует вашу dayOfYear() функцию, которая является относительно только в этом году. Два дня, которые находятся на расстоянии 1 год, возвратят то же значение dayOfYear(), и вычитание даст 0.

Чтобы решить эту проблему, вы можете сделать способ, который получает дни от эпохи UNIX (1 января 1970 г.) и сравнивает их.

Кроме того, чтобы программно получить текущую дату (а не устанавливать today вручную), используйте System.getCurrentTimeMillis(), чтобы получить миллисекунды от эпохи UNIX, то просто разделить дни и добавить их в 1/1/1970.

Смежные вопросы