java - para - metodos de la clase calendar
Agregar n horas a una fecha en Java? (15)
¿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.
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 nanoseconds .
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 legacy fecha y hora como java.util.Date
, java.util.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 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 .
- Android
- 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 more .
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
Con Joda-Time
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
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
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;
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();
}
Puede usar la clase LocalDateTime de Java 8. Por ejemplo:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Puedes hacerlo con Joda DateTime API
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
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.
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)
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
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);
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.
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);