69 votes

Objet Date vers Calendrier [Java]

J'ai une classe Movie dans laquelle j'ai une date de début, une durée et une date de fin. Les dates de début et de fin sont des objets de type date (private Date startDate ...). (C'est un devoir donc je ne peux pas changer cela) Je veux maintenant calculer automatiquement la date d'arrêt en ajoutant la durée (en minutes) à la date de début.

D'après ce que je sais, l'utilisation des fonctions de manipulation de l'heure de Date est dépréciée, donc une mauvaise pratique, mais d'un autre côté, je ne vois aucun moyen de convertir l'objet Date en un objet calendrier afin de manipuler l'heure et de le reconvertir en objet Date. Existe-t-il un moyen ? Et si oui, quelle serait la meilleure pratique ?

4 votes

Si vous travaillez souvent avec des dates, je trouve que Joda Time est bien meilleur que les classes Date et Calendar de Java : joda-time.sourceforge.net

3 votes

Les personnes qui remettent des devoirs portant sur la date et le calendrier devraient être punies :-) Si j'étais à votre place, j'utiliserais l'API saine ajoutée dans JAVA 7.

0 votes

101voto

Lars Andren Points 2902

Ce que vous pourriez faire, c'est créer une instance d'une GregorianCalendar et ensuite définir le Date comme heure de départ :

Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);

Cependant, une autre approche consiste à ne pas utiliser Date du tout. Vous pourriez utiliser une approche comme celle-ci :

private Calendar startTime;
private long duration;
private long startNanos;   //Nano-second precision, could be less precise
...
this.startTime = Calendar.getInstance();
this.duration = 0;
this.startNanos = System.nanoTime();

public void setEndTime() {
        this.duration = System.nanoTime() - this.startNanos;
}

public Calendar getStartTime() {
        return this.startTime;
}

public long getDuration() {
        return this.duration;
}

De cette façon, vous pouvez accéder à la fois à l'heure de début et à la durée entre le début et la fin. La précision est bien sûr à votre convenance.

1 votes

L'implémentation de la date et de l'heure en Java est tellement merdique que je ne sais pas ce qui est le pire : garder JodaTime - même si le calcul de l'heure ne représente qu'une infime partie de la fonctionnalité globale de mon application - ou passer à Date/Calendar et passer des heures à patauger dans ce fouillis qui aurait dû être un composant solide et bien implémenté.

0 votes

@Melllvar C'est vrai. Maintenant vous avez une troisième alternative : le java.time intégrées à Java 8 et aux versions ultérieures. Pour Java 6 et 7, la plupart des java.time a fait l'objet d'un rétroportage dans la version Trois Dix-Backport projet. Pour les versions antérieures d'Android, voir le ThreeTenABP projet. Quant à Joda-Time ce projet est maintenant en mode maintenance, en désignant java.time comme son successeur officiel, son créateur Stephen Colebourne ayant dirigé les deux projets.

29voto

Bozhidar Batsov Points 23298
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

date est un objet java.util.Date. Vous pouvez également utiliser Calendar.getInstance() pour obtenir l'instance du calendrier (beaucoup plus efficace).

1 votes

Calendar.getInstance() renvoie un spécifique au niveau local Calendar il est donc généralement préférable de le faire.

6voto

polygenelubricants Points 136838

Vous n'avez pas besoin de vous convertir en Calendar pour cela, vous pouvez simplement utiliser getTime() / setTime() à la place.

getTime() : Renvoie le nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 GMT, représenté par cet objet Date.

setTime(long time) : Définit cet objet Date pour représenter un point dans le temps qui est des millisecondes de temps après le 1 janvier 1970 00:00:00 GMT. )

Il y a 1000 millisecondes dans une seconde, et 60 secondes dans une minute. Faites le calcul.

    Date now = new Date();
    Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
    System.out.println(now);
    System.out.println(oneMinuteInFuture);

El L suffixe dans 1000 signifie qu'il s'agit d'un long littéral ; ces calculs débordent généralement int facilement.

6voto

Michael Borgwardt Points 181658

Calendar.setTime()

Il est souvent utile de regarder la signature et la description des méthodes de l'API, et pas seulement leur nom :) - Même dans l'API standard de Java, les noms peuvent parfois être trompeurs.

0voto

Xorty Points 4967

Quelque chose comme

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X