Aggiunta di n ore a una data in Java?

Come posso aggiungere n ore a un object Date? Ho trovato un altro esempio utilizzando giorni su StackOverflow, ma ancora non capisco come farlo con ore.

Controlla la class del calendario. Ha add metodo (e alcuni altri) per consentire la manipolazione del tempo. Qualcosa del genere dovrebbe funzionare.

  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 

Controlla API per altro.

Se usi Apache Commons / Lang , puoi farlo in un solo passaggio usando DateUtils.addHours() :

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

(L’object originale è invariato)

Per semplificare l’esempio di @ Christopher.

Dì che hai una costante

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

Tu puoi scrivere.

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

Se si usa molto tempo per memorizzare data / ora invece dell’object Date che si può fare

 long newDate = oldDate + 2 * HOUR; 

Con Joda-Time

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

tl; dr

 myJavaUtilDate.toInstant() .plusHours( 8 ) 

O…

 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. 

Utilizzando java.time

Il framework java.time incorporato in Java 8 e successivo sostituisce le vecchie classi Java.util.Date/.Calendar. Quelle vecchie classi sono notoriamente fastidiose. Evitalo.

Utilizzare il metodo toInstant recentemente aggiunto a java.util.Date per convertire dal vecchio tipo al nuovo tipo java.time. Un Instant è un momento sulla linea del tempo in UTC con una risoluzione di nanosecondi .

 Instant instant = myUtilDate.toInstant(); 

Puoi aggiungere ore a Instant passando un TemporalAmount come la Duration .

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

Per leggere questa data, generare una stringa in formato ISO 8601 standard chiamando a Stringa.

 String output = instantHourLater.toString(); 

Potresti voler vedere quel momento attraverso l’objective dell’orologio a muro di alcune regioni. Regola l’ Instant nel fuso orario desiderato / atteso creando un ZonedDateTime .

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

In alternativa, puoi chiamare plusHours per aggiungere il conteggio delle ore. Essere zonati significa che l’ora legale (DST) e altre anomalie verranno gestite per conto dell’utente.

 ZonedDateTime later = zdt.plusHours( 8 ); 

Evitare di utilizzare le vecchie classi di data e ora compresi java.util.Date e .Calendar . Ma se hai veramente bisogno di un java.util.Date per l’interoperabilità con le classi non ancora aggiornate per i tipi java.time, converti da ZonedDateTime tramite Instant . Nuovi metodi aggiunti alle vecchie classi facilitano la conversione da / verso i tipi java.time.

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

Per ulteriori discussioni sulla conversione, vedere la mia risposta alla domanda, convertire java.util.Date a che tipo “java.time”? .


A proposito di java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date , Calendar e SimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

È ansible scambiare oggetti java.time direttamente con il proprio database. Utilizzare un driver JDBC compatibile con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità per le classi java.sql.* .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 e versioni successive
    • Built-in.
    • Parte dell’API Java standard con un’implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per Android precedente (<26), il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP ….

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval , YearWeek , YearQuarter e altro .

Da quando Java 8:

 LocalDateTime.now().minusHours(1); 

Vedi API LocalDateTime .

Qualcosa di simile a:

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

Usando la nuova class java.util.concurrent.TimeUnit puoi farlo in questo modo

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

Questa è un’altra parte di codice quando l’object Date è in formato Datetime. La bellezza di questo codice è, se si dà più numero di ore, la data verrà aggiornata di conseguenza.

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

Ecco l’output:

  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 

Se sei disposto ad usare java.time , ecco un metodo per aggiungere le durate formattate 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. 

Puoi farlo con l’API Joda DateTime

 DateTime date= new DateTime(dateObj); date = date.plusHours(1); dateObj = date.toDate(); 
 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); 

utilizzando le classi Java 8. possiamo manipolare data e ora molto facilmente come di seguito.

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

È ansible utilizzare la class LocalDateTime da Java 8. Ad esempio:

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

È ansible utilizzare questo metodo, è facile da capire e implementare:

 public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.HOUR_OF_DAY, nombreHeure); calendar.add(Calendar.MINUTE, nombreMinute); calendar.add(Calendar.SECOND, nombreSeconde); return calendar.getTime(); }