¿Cómo agrego n horas a un objeto Date? Encontré otro ejemplo usando días en StackOverflow, pero aún no entiendo cómo hacerlo con horas.
¿Cómo agrego n horas a un objeto Date? Encontré otro ejemplo usando días en StackOverflow, pero aún no entiendo cómo hacerlo con horas.
Respuestas:
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.
Calendar.add()se encarga de eso automáticamente.
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 .
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)
DateUtils.addHours(oldDate, -1);
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;
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.
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"? .
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?
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 .
Con Joda-Time
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
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.
java.util.Dateobjeto como el solicitante nos había pedido ZonedDateTime.toInstant()y Date.from()como se describe aquí stackoverflow.com/a/32274725/5661065
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
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
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 .
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
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);
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.
Duration.parse(iso8601duration)Es interesante, gracias, pero no se puede utilizar el operador +de LocalDateTime, es posible que desee editar eso. Pero .plus(...)funciona.
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?
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.
Puedes hacerlo con Joda DateTime API
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
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);
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?
Puede usar la clase LocalDateTime de Java 8. Por ejemplo:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
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?
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();
}