¿Agregar n horas a una fecha en Java?

Respuestas:

210

Consultar calendario de clase. Tiene un addmétodo (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.

Nikita Rybak
fuente
44
Solo tenga cuidado si está lidiando con el horario de verano / horario de verano.
CurtainDog
55
No hace falta mencionar que puede añadir "horas negativos"
pramodc84
66
@CurtainDog Using Calendar.add()se encarga de eso automáticamente.
Jesper
66
cal.setTime (new Date ()) no es necesario: el javadoc de Calendar.getInstance () dice: "El calendario devuelto se basa en la hora actual en la zona horaria predeterminada con la configuración regional predeterminada".
mithrandir
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle .
Basil Bourque
82

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

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

(El objeto original no ha cambiado)

Sean Patrick Floyd
fuente
3
También puede usar Horas negativas:DateUtils.addHours(oldDate, -1);
Kaptain
Detrás de escena, esto hace exactamente lo que hace la respuesta de Nikita, pero esto es muy simple y fácil de leer. Además, si ya usa Apache Commons / Lang ... ¿por qué no?
Matt
28

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 tiempo para almacenar la fecha / hora en lugar del objeto Fecha, puede hacer

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

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 a las antiguas clases Java.util.Date/.Calendar. Esas viejas clases son notoriamente problemáticas. Evítales.

Use el toInstantmétodo recién agregado a java.util.Date para convertir del tipo antiguo al nuevo tipo java.time. Un Instantes un momento en la línea de tiempo en UTC con una resolución de nanosegundos .

Instant instant = myUtilDate.toInstant();

Puede agregar horas a eso Instantpasando un TemporalAmounttal como Duration.

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

Para leer esa fecha y hora, genere una Cadena en formato estándar ISO 8601 llamando toString.

String output = instantHourLater.toString();

Es posible que desee ver ese momento a través de la lente del reloj de pared de alguna región . Ajuste la Instantzona horaria deseada / esperada creando a ZonedDateTime.

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

Alternativamente, puede llamar plusHourspara agregar su conteo de horas. Estar dividido en zonas significa que el horario de verano (DST) y otras anomalías se manejarán en su nombre.

ZonedDateTime later = zdt.plusHours( 8 );

Debe evitar usar las antiguas clases de fecha y hora, incluidas java.util.Datey .Calendar. Pero si realmente necesita una java.util.Dateinteroperabilidad con clases aún no actualizadas para los tipos java.time, convierta desde ZonedDateTimevia Instant. Los nuevos métodos agregados a las clases antiguas facilitan la conversión a / desde los tipos 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"? .


Sobre java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases 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. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de java.sql.*clases.

¿Dónde obtener las clases java.time?

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

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .

Albahaca Bourque
fuente
23

Con Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
Babar
fuente
2
+1 es un poco innecesario para esto, pero si vas a hacer más manipulación de citas, Joda Time es una gran biblioteca
Joeri Hendrickx
3
@JoeriHendrickx Si el programador agrega horas a una fecha, es muy probable que esté haciendo otro trabajo de fecha y hora. No considero que Joda-Time sea innecesario en absoluto; Lo primero que hago al configurar cualquier proyecto nuevo es agregar Joda-Time. Incluso Sun y Oracle acordaron que el viejo java.util.Date & Calendar necesita ser eliminado, por lo que agregaron el nuevo paquete java.time. * (Inspirado en Joda-Time) a Java 8.
Basil Bourque
Tuve problemas con Joda en Android. ClassNotDefinedException
Seguí
23

Desde Java 8:

LocalDateTime.now().minusHours(1);

Ver LocalDateTimeAPI .

leventov
fuente
44
Cerca pero no del todo bien. Deberías ir por una en ZonedDateTimelugar de una LocalDateTime. "Local" significa que no está vinculado a ninguna localidad en particular, y no está vinculado a la línea de tiempo. Como "La Navidad comienza a la medianoche del 25 de diciembre de 2015" es un momento diferente en las distintas zonas horarias, sin sentido hasta que aplique una zona horaria particular para obtener un momento particular en la línea de tiempo. Además, sin una zona horaria, el horario de verano (DST) y otras anomalías no se manejarán con dicho uso de LocalDateTime. Ver mi respuesta en comparación.
Basil Bourque
1
También para obtener un java.util.Dateobjeto como el solicitante nos había pedido ZonedDateTime.toInstant()y Date.from()como se describe aquí stackoverflow.com/a/32274725/5661065
hayduke
16

Usando la nueva clase 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
Iain
fuente
14

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
Christopher Hunt
fuente
1
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle .
Basil Bourque
7

Este es otro código cuando su Dateobjeto está en formato de fecha y hora. La belleza de este código es que 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
vkrams
fuente
1
También puede usar: Calendar cal = Calendar.getInstance ();
Stefan Sprenger
4
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);
Jinete Fantasma
fuente
4

Si está dispuesto a usar java.time, aquí hay un método para agregar duraciones con formato 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.  
Daniel
fuente
1
Duration.parse(iso8601duration)Es interesante, gracias, pero no se puede utilizar el operador +de LocalDateTime, es posible que desee editar eso. Pero .plus(...)funciona.
qlown
Gracias @qlown, supongo que el + funciona de maravilla porque así es como lo estoy usando ahora. Modificaré la respuesta en consecuencia.
Daniel
La pregunta es sobre un Dateobjeto, que representa un momento específico en UTC. Su uso de LocalDateTimeno responde a la pregunta. LocalDateTimecarece de cualquier concepto de zona horaria o desplazamiento desde UTC, y por lo tanto no puede representar un momento. Clase incorrecta para este problema. Consulte ¿Cuál es la diferencia entre Instant y LocalDateTime?
Basil Bourque
El Dateobjeto @BasilBourque está en desuso. La pregunta es ambigua cuando se trata de la zona horaria, por lo que mis respuestas se mantienen. Además, puedes cambiar LocalDateTimepor ZonedDateTime.
Daniel
4

Puedes hacerlo con Joda DateTime API

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
Rata
fuente
Trabajando después de que cambié la primera línea en DateTime dateTime = new DateTime (dateObj);
Sundararaj Govindasamy
1

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);
Abdul Gafoor
fuente
La pregunta es sobre un Dateobjeto, que representa un momento específico en UTC. Su uso de LocalDateTimeno responde a la pregunta. LocalDateTimecarece de cualquier concepto de zona horaria o desplazamiento desde UTC, y por lo tanto no puede representar un momento. Clase incorrecta para este problema. Consulte ¿Cuál es la diferencia entre Instant y LocalDateTime?
Basil Bourque
0

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

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Sajit Gupta
fuente
La pregunta es sobre un Dateobjeto, que representa un momento específico en UTC. Su uso de LocalDateTimeno responde a la pregunta. LocalDateTimecarece de cualquier concepto de zona horaria o desplazamiento desde UTC, y por lo tanto no puede representar un momento. Clase incorrecta para este problema. Consulte ¿Cuál es la diferencia entre Instant y LocalDateTime?
Basil Bourque
-1

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();
}
Nimpo
fuente
Este enfoque ya se presentó en otra respuesta publicada hace años. No veo cómo este agrega más valor.
Basil Bourque
El valor agregado de mi propuesta es la simplicidad y facilidad de implementación, el usuario solo tiene que pegarlo y usarlo y agregar las horas, minutos o segundos, como saben, el nivel de Principiantes difiere y si las respuestas propuestas se combinan entre respuestas simples y respuestas avanzadas será apreciable :)
Nimpo