web-dev-qa-db-fra.com

Ajouter n heures à une date en Java?

Comment ajouter n heures à un objet Date? J'ai trouvé un autre exemple d'utilisation de jours sur StackOverflow, mais je ne comprends toujours pas comment le faire en heures.

120
Jorge Lainfiesta

Consultez la classe du calendrier. Il a la méthode add (et quelques autres) pour permettre la manipulation du temps. Quelque chose comme ça devrait marcher.

    Calendar cal = Calendar.getInstance(); // creates calendar
    cal.setTime(new Date()); // sets calendar time/date
    cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
    cal.getTime(); // returns new date object, one hour in the future

Vérifiez API pour plus.

192
Nikita Rybak

Si vous utilisez Apache Commons/Lang , vous pouvez le faire en une seule étape en utilisant DateUtils.addHours() :

Date newDate = DateUtils.addHours(oldDate, 3);

(L'objet d'origine est inchangé)

67
Sean Patrick Floyd

Pour simplifier l'exemple de @ Christopher.

Disons que vous avez une constante

public static final long HOUR = 3600*1000; // in milli-seconds.

Tu peux écrire.

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Si vous utilisez long pour stocker la date/heure à la place de l'objet Date, vous pouvez le faire

long newDate = oldDate + 2 * HOUR;
27
Peter Lawrey

tl; dr

myJavaUtilDate.toInstant()
              .plusHours( 8 )

Ou…

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

Utiliser Java.time

L'infrastructure Java.time intégrée à Java 8 et versions ultérieures supplante les anciennes classes Java.util.Date/.Calendar. Ces anciennes classes sont notoirement gênantes. Évite-les.

Utilisez la méthode toInstant récemment ajoutée à Java.util.Date pour convertir l'ancien type en nouveau type Java.time. Une Instant est un moment sur la ligne de temps dans UTC avec une résolution de nanosecondes .

Instant instant = myUtilDate.toInstant();

Vous pouvez ajouter des heures à cette Instant en passant un TemporalAmount tel que Duration

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

Pour lire cette date-heure, générez une chaîne au format ISO 8601 en appelant toString .

String output = instantHourLater.toString();

Vous voudrez peut-être voir ce moment à travers l’objectif de la heure de l'horloge murale d'une région. Ajustez la Instant au fuseau horaire souhaité/attendu en créant un ZonedDateTime .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Vous pouvez également appeler plusHours pour ajouter votre nombre d'heures. Être zoné signifie que l'heure d'été (DST) et d'autres anomalies seront traitées en votre nom.

ZonedDateTime later = zdt.plusHours( 8 );

Vous devriez éviter d'utiliser les anciennes classes date-heure, y compris Java.util.Date et .Calendar. Mais si vous avez vraiment besoin d'un Java.util.Date pour une interopérabilité avec les classes non encore mises à jour pour les types Java.time, convertissez-le à partir de ZonedDateTime via Instant. De nouvelles méthodes ajoutées aux anciennes classes facilitent la conversion vers/depuis les types Java.time.

Java.util.Date date = Java.util.Date.from( later.toInstant() );

Pour plus de discussion sur la conversion, voir ma réponse à la question, Convertir Java.util.Date en quel type «Java.time»?? .


À 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 maintenance }, conseille la migration vers les classes Java.time .

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.* classes.

Où obtenir les classes Java.time? 

  • Java SE 8 , Java 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 Java SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Les versions ultérieures d'Android regroupent des implémentations des classes Java.time.
    • Pour les anciens Android (<26), le projet ThreeTenABP s’adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

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

23
Basil Bourque

Avec Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
23
Babar

Depuis Java 8:

LocalDateTime.now().minusHours(1);

Voir LocalDateTime API .

21
leventov

Quelque chose comme:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours
13
Christopher Hunt

En utilisant newish Java.util.concurrent.TimeUnit class vous pouvez le faire comme ceci

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours
11
Iain

Ceci est un autre morceau de code lorsque votre objet Date est au format Datetime. La beauté de ce code est que, si vous donnez plus d'heures, la date sera également mise à jour en conséquence.

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

Voici la sortie:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014
6
vkrams

Si vous êtes prêt à utiliser Java.time, voici une méthode pour ajouter des durées formatées ISO 8601:

import Java.time.Duration;
import Java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  
4
Daniel

Vous pouvez le faire avec l'API Joda DateTime

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
4
Rahul Tyagi
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);
3
Ghost Rider

en utilisant des classes Java 8. nous pouvons manipuler la date et l'heure très facilement comme ci-dessous.

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);
0
Abdul Gafoor

Vous pouvez utiliser la classe LocalDateTime à partir de Java 8. Par exemple:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
0
Sajit Gupta