используя Java-календарь - PullRequest
       10

используя Java-календарь

1 голос
/ 20 марта 2010

У меня простая задача. Есть два класса: билет и дата. Билет содержит событие, место события и дату события, которое является объектом Date. Мне также нужно предоставить метод move () для объекта Date, поэтому я использовал Calendar и Calendar add (). Все выглядит хорошо, кроме вывода. Я постоянно получаю одинаковую дату для всех объектов Событий. Код:

Класс билетов:

public class Ticket {

private String what;
private String where;
private Date when;

public Ticket(String s1, String s2, Data d){
    this.what = s1;
    this.where = s2;
    this.when = d;
}

public Date giveDate(){
    System.out.println("when in giveDate() "+this.when);
    return this.when;
}

public String toString(){
    return "what: "+this.what+"\n"+"where: "+this.where+"\n"+"when: "+this.when;
}

}

Дата класса:

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Date {

public int day;
public int month;
public int year;

public Date(int x, int y, int z){
    this.day = x;
    this.month = y;
    this.year = z;
}

public Date move(int p){

    Calendar gc = new GregorianCalendar(this.year, this.month, this.day);
    gc.add(Calendar.DAY_OF_YEAR, p);

    this.year = gc.get(Calendar.YEAR);
    this.day = gc.get(Calendar.DAY_OF_MONTH);
    this.month = gc.get(Calendar.MONTH);

    return this;
}

@Override
public String toString(){
    return this.day+","+this.month+","+this.year;
}

}

Основное для тестирования:

 Date date1=new Date(30,4,2002);
 Ticket event1=new Ticket("Peter Gabriel's gig",
                      "London",date1
                     );
 System.out.println(event1);

 Ticket event2=new Ticket("Diana Kroll's concert",
                      "Glasgow",date1
                     );
 System.out.println(event2);

 Date date2=event2.giveDate();

 date2.move(30);
 Ticket event3=new Ticket("X's B-day",
                      "some place",date2
                     );
 System.out.println(event3);

 System.out.println(event1);
 System.out.println(event2);
 System.out.println(event3);

А вот и мой вывод. После создания Событий у них правильная дата, но в конце все они получают одинаковую дату, не знаю почему: /

what: Peter Gabriel's gig
where: London
when: 30,4,2002
what: Diana Krall's concert
where: Glasgow
when: 6,12,2004
what: X's B-day
where: some place
when: 5,1,2005
what: Peter Gabriel's gig
where: London
when: 5,1,2005
what: Diana Krall's concert
where: Glasgow
when: 5,1,2005
what: X's B-day
where: some place
when: 5,1,2005

Ответы [ 3 ]

4 голосов
/ 20 марта 2010

Божо дал правильный ответ о том, почему вы видите именно это поведение. Тем не менее, это симптом более серьезной проблемы: во-первых, использование java.util.Calendar. У меня есть два предложения:

  • Не пишите класс под названием Date, когда читатели вполне могут предположить, что вы имеете в виду java.util.Date
  • Не используйте java.util.{Date,Calendar} - используйте Joda Time . Это намного лучший API, который усложняет ошибку такого рода. Даты и время достаточно сложны без необходимости бороться с мусорным API.
4 голосов
/ 20 марта 2010

константы YEAR, DAY_OF_MONTH и т. Д. Calendar являются целочисленными значениями для внутреннего использования в Calendar. Они обозначают поле в календаре, а не значение.

Вы получаете значение следующим образом:

gc.get(Calendar.YEAR); (or gc.get(gc.YEAR), but better access it statically)

Согласно вашему обновлению, сначала избавьтесь от конструктора Date(int, int, int). Это устарело:

Дата (int год, int месяц, int дата)
Устаревшие . Начиная с версии 1.1 JDK, заменено на Calendar.set (год + 1900, месяц, дата) или GregorianCalendar (год + 1900, месяц, дата).

0 голосов
/ 22 марта 2010

Хорошо, поэтому решение было следующим:

в дате

public Date( Date d){
    this.day = d.day;
    this.month = d.month;
    this.year = d.year;
}

и в билете:

public Ticket(String s1, String s2, Data d){
    this.what = s1;
    this.where = s2;
    this.when = new Date(d);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...