2010-08-27 29 views
101

¿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.¿Agregar n horas a una fecha en Java?

+3

Use http://joda-time.sourceforge.net/, si es posible. – Babar

+0

Esa [URL para Joda-Time] (http://www.joda.org/joda-time/) ha cambiado desde la publicación de Babar. –

+1

Utilice [Fecha Java 8] (http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html) y tiempo si es posible. – peceps

Respuesta

169

Consulte la clase de calendario. Tiene el 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 

Compruebe API para más.

+4

Solo tenga cuidado si está lidiando con el horario de verano/horario de verano. – CurtainDog

+4

No hace falta mencionar que puede agregar "horas negativas" – pramodc84

+6

@CurtainDog Usando 'Calendar.add()' se encarga de eso automáticamente. – Jesper

53

Si utiliza Apache Commons/Lang, lo puede hacer en un solo paso utilizando DateUtils.addHours():

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

(El objeto original permanece sin cambios)

+1

También puede usar negativ Horas: 'DateUtils.addHours (oldDate, -1);' – Kaptain

+0

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 usas Apache Commons/Lang ... ¿por qué no? – Matt

22

Con Joda-Time

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

+1 un poco innecesario para esto, pero si va a hacer más manipulación de fecha, joda time es una gran biblioteca –

+2

@JoeriHendrickx Si el programador está agregando horas a una fecha, entonces * muy * probable que estén haciendo otra fecha -hora de trabajar. No considero [Joda-Time] (http://www.joda.org/joda-time/) innecesario en absoluto; Lo primero que hago al configurar cualquier proyecto nuevo es agregar Joda-Time. Incluso Sun y Oracle estuvieron de acuerdo en que el antiguo java.util.Date & Calendar necesita ser eliminado, por lo que agregaron el nuevo [java.time. * Paquete] (http://download.java.net/jdk8/docs/api). /java/time/package-summary.html) (inspirado en Joda-Time) a Java 8. –

+0

Tuve problemas con Joda en Android. Se guardó 'ClassNotDefinedException' – TheRealChx101

13

Algo así 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 
24

Para simplificar el ejemplo de @ Christopher.

Digamos que tiene una constante

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

Puede escribir.

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

Si utiliza largo para almacenar la fecha/hora en lugar del objeto Fecha que puede hacer

long newDate = oldDate + 2 * HOUR; 
10

Utilización de la clase newish java.util.concurrent.TimeUnit puede hacerlo de esta manera

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

Desde Java 8:

LocalDateTime.now().minusHours(1); 

Ver LocalDateTime API.

+1

Cerrar pero no del todo bien. Debería elegir 'ZonedDateTime' en lugar de' LocalDateTime'. "Local" significa * no * vinculado a una localidad en particular, y * no * vinculado a la línea de tiempo.Al igual que "La Navidad comienza a la medianoche del 25 de diciembre de 2015" es un momento diferente en las distintas zonas horarias, sin significado hasta que aplique un huso horario determinado para obtener un momento determinado de 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] (http://stackoverflow.com/a/33021219/642706) en comparación. –

+0

También para obtener un objeto 'java.util.Date' ya que el solicitante nos había pedido' ZonedDateTime.toInstant() 'y' Date.from() 'como se describe aquí https://stackoverflow.com/a/32274725/5661065 – hayduke

5

Esta es otra pieza de código cuando su objeto Date está en formato de fecha y 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 
+0

También puede usar: Calendario cal = Calendar.getInstance(); –

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

tl; dr

myUtilDate.toInstant().plus(Duration.ofHours(8)) 

Usando java.time

El marco java.time incorporado en Java 8 y más tarde suplanta las antiguas clases de Java.util.Date/.Calendar. Esas viejas clases son notoriamente problemáticas. Evítales.

Utilice 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 nanoseconds.

Instant instant = myUtilDate.toInstant(); 

Puede agregar horas para que Instant pasando un TemporalAmount como Duration.

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

Para leer esa fecha a tiempo, generar una cadena en formato ISO 8601 estándar llamando toString.

String output = instantHourLater.toString(); 

Es posible que desee ver ese momento a través de la lente de alguna región de wall-clock time. 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 plusHours añadir su recuento 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); 

Usted debe evitar el uso de las clases de edad de fecha y hora, incluyendo java.util.Date y .Calendar. Pero si realmente necesita un java.util.Date para la interoperabilidad con las clases aún no actualizadas para los tipos de java.time, convierta de ZonedDateTime a 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 mayor discusión sobre la conversión, consulte my Answer a la pregunta, Convert java.util.Date to what “java.time” type?.


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a java.time.

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

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver How to use….

El proyecto se extiende ThreeTen-Extra 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 more.

4

Puede hacerlo con API Joda DateTime

DateTime date= new DateTime(dateObj); 
date = date.plusHours(1); 
dateObj = date.toDate(); 
+0

Trabajando después de haber cambiado la 1ra línea en DateTime dateTime = new DateTime (dateObj); –

-1

Puede utilizar este método, es fácil de entender y poner en práctica:

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

Este enfoque ya se presentó en [otra respuesta] (http://stackoverflow.com/a/3581278/642706) publicado hace años. No veo cómo esto agrega más valor. –

+0

El valor agregado de mi propuesta es la simplicidad y la facilidad de implementación, el usuario solo tiene que pegarlo y usarlo y agregar las horas, minutos o segundos, como usted sabe, el nivel de principiante es diferente y si las respuestas propuestas se combinan entre simple respuestas y respuestas avanzadas será apreciable :) – Nimpo

4

Si usted está dispuesto a utilizar java.time, aquí está 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. 
+1

'Duration.parse (iso8601duration)' es interesante, gracias, pero no se puede usar el operador '+' en 'LocalDateTime', es posible que desee editar eso. Pero '.plus (...)' funciona. – qlown

+0

Gracias @qlown, supongo que el + está funcionando en groovy porque así es como lo estoy usando ahora. Voy a modificar la respuesta en consecuencia. – Daniel

Cuestiones relacionadas