Agregar n horas a una fecha en Java?

¿Cómo agrego n horas a un objeto Date? Encontré otro ejemplo usando días en StackOverflow, pero todavía no entiendo cómo hacerlo con horas.

Verifique la clase de calendario. Tiene método add (y algunos otros) para permitir la manipulación del tiempo. Algo como esto debería funcionar.

  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 

Verifique API para más.

Si utiliza Apache Commons / Lang , puede hacerlo en un solo paso usando DateUtils.addHours() :

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

(El objeto original no ha cambiado)

Para simplificar el ejemplo de @ Christopher.

Digamos que tienes una constante

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

Puedes escribir.

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

Si usa mucho para almacenar la fecha / hora en lugar del objeto Date, puede hacer

 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. 

Usando java.time

El marco java.time integrado en Java 8 y posterior suplanta las antiguas clases Java.util.Date/.Calendar. Esas viejas clases son notoriamente problemáticas. Evítales.

Use el método toInstant recientemente agregado a java.util.Date para convertir del tipo anterior al nuevo tipo java.time. Un Instant es un momento en la línea de tiempo en UTC con una resolución de nanosegundos .

 Instant instant = myUtilDate.toInstant(); 

Puede agregar horas a ese Instant al pasar un TemporalAmount como Duration .

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

Para leer esa fecha-hora, genere un String en formato estándar ISO 8601 llamando a toString .

 String output = instantHourLater.toString(); 

Es posible que desee ver ese momento a través de la lente de la hora del reloj de pared de una región. Ajuste el Instant en su zona horaria deseada / esperada creando un ZonedDateTime .

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

Alternativamente, puede llamar a plusHours para agregar su cantidad de horas. Ser zonificado significa que el horario de verano (DST) y otras anomalías se manejarán en su nombre.

 ZonedDateTime later = zdt.plusHours( 8 ); 

Debe evitar el uso de las antiguas clases de fecha y hora, incluidas java.util.Date y .Calendar . Pero si realmente necesita un java.util.Date para la interoperabilidad con clases aún no actualizadas para los tipos java.time, convierta de ZonedDateTime través de Instant . Los nuevos métodos agregados a las clases antiguas facilitan la conversión a / de los tipos de java.time.

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

Para obtener más información sobre la conversión, consulte mi respuesta a la pregunta, Convertir java.util.Date a qué tipo de “java.time”? .


Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

Desde Java 8:

 LocalDateTime.now().minusHours(1); 

Vea la API LocalDateTime .

Algo como:

 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 clase newish java.util.concurrent.TimeUnit puedes hacerlo así

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

Esta es otra pieza de código cuando su objeto Date está en formato de Date hora. La belleza de este código es: si le das más horas, la fecha también se actualizará en consecuencia.

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

Aquí está la salida:

  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 

Si está dispuesto a usar java.time , aquí hay un método para agregar duraciones formateadas 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. 

Puedes hacerlo con Joda DateTime API

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

mediante el uso de clases Java 8. podemos manipular la fecha y la hora muy fácilmente como a continuación.

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

Puede usar la clase LocalDateTime de Java 8. Por ejemplo:

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

Puede usar este método, es fácil de entender e implementar:

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