web-dev-qa-db-fra.com

Date objet au calendrier [Java]

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

65
Samuel

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.

95
Lars Andren
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).

27
Bozhidar Batsov

Calendar.setTime()

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.

6
Michael Borgwardt

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.

6
polygenelubricants

tl; dr

Instant stop = 
    myUtilDateStart.toInstant()
                   .plus( Duration.ofMinutes( x ) ) 
;

Java.time

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

À propos de Java.time

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? 

  • Java SE 8 et SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android

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 _.

2
Basil Bourque

quelque chose comme

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

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);
0
Vitor Reais