utilisation du calendrier java


J'ai une tâche simple. Il y a deux classes : Billet et Date. Le ticket contient l'événement, le lieu de l'événement et la date de l'événement qui est un objet Date. J'ai également besoin de fournir une méthode move() pour l'objet Date, j'ai donc utilisé Calendar et Calendar add(). Tout semble bien en dehors de la sortie. J'obtiens constamment la même date pour tous les objets d'événement. Le code:

Classe de billets:

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

}

Classe de date:

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

}

Principal pour tester:

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

Et voici ma sortie. Après la création d' Événements, ils ont la date appropriée, mais à la fin, tous obtiennent la même date ne sais pas pourquoi: /

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
Author: owca, 2010-03-20

3 answers

Bozho a donné la bonne réponse quant à la raison pour laquelle vous voyez ce comportement particulier. Cependant, cela est symptomatique d'un problème plus important: l'utilisation de java.util.Calendrier en premier lieu. J'ai deux suggestions à faire:

  • N'écrivez pas une classe appelée Date lorsque les lecteurs peuvent bien supposer que vous voulez dire java.util.Date
  • N'utilisez pas java.util.{Date,Calendar} - utilisez plutôt Joda Time. C'est une bien meilleure API qui rend plus difficile ce genre d'erreur. Les dates et les heures sont assez difficiles sans avoir pour lutter contre une API de déchets.
 4
Author: Jon Skeet, 2010-03-20 20:34:23

Le YEAR, DAY_OF_MONTH, etc. les constantes de Calendar sont des valeurs entières à usage interne dans le Calendar. Ils désignent le champ dans le calendrier, pas la valeur.

Vous obtenez la valeur de cette façon:

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

Selon votre mise à jour, débarrassez-vous d'abord du constructeur Date(int, int, int). Il a été obsolète:

Date(int année, int mois, int jour)
Obsolète. À partir de la version 1.1 de JDK, remplacé par Calendar.set (année + 1900, mois, date) ou GregorianCalendar(année + 1900, mois, jour).

 4
Author: Bozho, 2010-03-20 21:11:46

D'accord donc la solution était la suivante:

En date

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

Et dans le Ticket:

public Ticket(String s1, String s2, Data d){
    this.what = s1;
    this.where = s2;
    this.when = new Date(d);
}
 0
Author: owca, 2010-03-22 12:46:41