J'ai une classe Movieen elle, j'ai une date de début, une durée et une date d'arrêt .. ... Les dates de début et de fin sont des objets de date (date privée Date de début ...) 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.
A ma connaissance, travailler avec les fonctions de manipulation de date de Date est obsolète, ce qui est une mauvaise pratique, mais je ne vois aucun moyen de convertir l'objet Date en objet calendrier afin de manipuler l'heure et de le reconvertir en objet Date ..__ Est-ce qu'il y a un moyen? Et s’il existe une pratique exemplaire
Ce que vous pouvez faire est de créer une instance de GregorianCalendar
puis de définir Date
comme heure de début:
Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);
Cependant, une autre approche consiste à ne pas utiliser Date
du tout. Vous pouvez 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 obtenir la durée du début à la fin. La précision est à vous bien sûr.
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);
date est un objet Java.util.Date. Vous pouvez également utiliser Calendar.getInstance () pour obtenir l'instance de Calendar (beaucoup plus efficace).
Il est souvent utile d'examiner la signature et la description des méthodes de l'API, pas seulement leur nom :) - Même dans l'API standard Java, les noms peuvent parfois être trompeurs.
Vous n'avez pas besoin de convertir 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, exprimé en millisecondes après le 1er janvier 1970, à 00:00:00 GMT. )
Il y a 1000 millisecondes en une seconde et 60 secondes en une minute. Faites juste le calcul.
Date now = new Date();
Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
System.out.println(now);
System.out.println(oneMinuteInFuture);
Le suffixe L
dans 1000
signifie qu'il s'agit d'un littéral long
; ces calculs débordent généralement int
facilement.
Instant stop =
myUtilDateStart.toInstant()
.plus( Duration.ofMinutes( x ) )
;
Les autres réponses sont correctes, en particulier la réponse de Borgwardt . Mais ces réponses utilisent des classes héritées obsolètes.
Les classes date-heure d'origine fournies avec Java ont été supplantées par les classes Java.time. Exécutez votre logique métier dans les types Java.time. Convertissez les anciens types uniquement si nécessaire pour utiliser du code ancien non encore mis à jour pour gérer les types Java.time.
Si votre Calendar
_ est en fait un GregorianCalendar
, vous pouvez convertir en ZonedDateTime
. Recherchez de nouvelles méthodes ajoutées aux anciennes classes pour faciliter la conversion vers/depuis les types Java.time.
if( myUtilCalendar instanceof GregorianCalendar ) {
GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if
Si votre Calendar
n'est pas une Gregorian
, appelez toInstant
pour obtenir un objet Instant
. La classe Instant
représente un moment sur la ligne temporelle dans UTC avec une résolution de nanosecondes .
Instant instant = myCal.toInstant();
De même, si vous commencez par un objet Java.util.Date
, convertissez-le en Instant
. La classe Instant
représente un moment sur la ligne temporelle en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Instant instant = myUtilDate.toInstant();
Appliquez un fuseau horaire pour obtenir un ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Pour obtenir un objet Java.util.Date
, suivez la Instant
.
Java.util.Date utilDate = Java.util.Date.from( zdt.toInstant() );
Pour plus de détails sur la conversion entre les types date-heure hérités et Java.time, et un diagramme astucieux, voir ma réponse en une autre question.
Duration
Représente l'intervalle de temps sous la forme d'un objet Duration
. Votre saisie pour la durée est un nombre de minutes mentionné dans la question.
Duration d = Duration.ofMinutes( yourMinutesGoHere );
Vous pouvez ajouter cela au début pour déterminer l’arrêt.
Instant stop = startInstant.plus( d );
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date
, Calendar
_, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode mode de maintenance , conseille la migration vers Java.time.
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes Java.time?
Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval
_, YearWeek
, YearQuarter
_ et plus _.
quelque chose comme
movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
Voici un exemple complet sur la façon de transformer votre date en différents types:
Date date = Calendar.getInstance().getTime();
// Display a date in day, month, year format
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with day name in a short format
formatter = new SimpleDateFormat("EEE, dd/MM/yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with a short day and month name
formatter = new SimpleDateFormat("EEE, dd MMM yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Formatting date with full day and month name and show time up to
// milliseconds with AM/PM
formatter = new SimpleDateFormat("EEEE, dd MMMM yyyy, hh:mm:ss.SSS a");
today = formatter.format(date);
System.out.println("Today : " + today);