Cambiar la fecha de Java una hora atrás

4 minutos de lectura

avatar de usuario
Makky

Tengo un objeto de fecha Java:

Date currentDate = new Date();

Esto le dará la fecha y hora actual. Ejemplo:

Thu Jan 12 10:17:47 GMT 2012

En cambio, quiero obtener la fecha, cambiándola a una hora atrás, por lo que debería darme:

Thu Jan 12 09:17:47 GMT 2012

¿Cuál sería la mejor manera de hacerlo?

  • Hay alguna mktime equivalente en java? restarle 60 minutos?

    – Shiplu Mokaddim

    12 de enero de 2012 a las 10:21

avatar de usuario
kimi

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8: java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

Java 8 java.tiempo.Instantáneo

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));

  • Solo tenga en cuenta el hecho de que hay Calendar.HOUR que funciona con un reloj de 12 horas y Calendar.HOUR_OF_DAY para un reloj de 24 horas: chintat.blogspot.ca/2006/05/…

    – Lobo

    27 de abril de 2015 a las 17:24

  • ¿Funcionaría la primera solución con Calendar si la hora es la medianoche de un día y desea una hora antes, que es a las 11 p. m. del día anterior?

    – Jorge Arokiam

    28 de septiembre de 2018 a las 14:51

  • @GeorgeArokiam sí lo haría

    – kimi

    1 oct 2018 a las 14:00

  • ¡Guau! Esta es una respuesta corta perfecta para la mayoría de las alternativas.

    – 4xMafole

    02/09/2021 a las 21:35

avatar de usuario
pedro laurey

Similar a la solución de @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

o

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

  • Mucho mejor solución. La creación de instancias de calendario parece una exageración en esta aplicación en particular.

    – León

    26 de diciembre de 2013 a las 10:22

  • @cosmolev Calendar es excesivo en la mayoría de los ejemplos que encuentro.

    – Peter Lawrey

    26 de diciembre de 2013 a las 10:39

  • @Stoan He agregado un ejemplo más legible. Debe tener en cuenta que Calendar es increíblemente ineficiente.

    – Peter Lawrey

    19 de enero de 2016 a las 13:53

  • @PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Esto debe ser 10 minutos de retraso?

    – Siya Sosibo

    19 de enero de 2016 a las 14:06

avatar de usuario
albahaca bourque

tl; dr

En UTC:

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

O, zonificado:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

Usando java.tiempo

Java 8 y posteriores tienen el nuevo java.tiempo marco incorporado.

Instant

Si solo le interesa el UTC (GMT), utilice el Instant clase.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

Volcar a la consola.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

instante: 2015-10-29T00:37:48.921Z | instantHourAnterior: 2015-10-28T23:37:48.921Z

Nótese cómo en este instante pasó a saltar a la fecha de ayer.

ZonedDateTime

Si le interesa una zona horaria, utilice el ZonedDateTime clase. Puedes empezar con un Instant y luego asignarle una zona horaria, un ZoneId objeto. Esta clase maneja los ajustes necesarios para anomalías tales como Horario de verano (DST).

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

Volcar a la consola.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

instante: 2015-10-29T00:50:30.778Z

hora: 2015-10-28T20:50:30.778-04:00[America/Montreal]

zdtHourAnterior: 2015-10-28T19:50:30.778-04:00[America/Montreal]

Conversión

Las antiguas clases java.util.Date/.Calendar ahora están obsoletas. Evítales. Son notoriamente problemáticos y confusos.

Cuando deba usar las clases antiguas para operar con código antiguo aún no actualizado para los tipos java.time, llame a los métodos de conversión. Aquí hay un código de ejemplo que va de Instant o ZonedDateTime a java.util.Date.

java.util.Date date = java.util.Date.from( instant );

…o…

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

Sobre java.tiempo

los java.tiempo framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas legado clases de fecha y hora como java.util.Date, Calendar& SimpleDateFormat.

los Joda-Tiempo proyecto, ahora en modo de mantenimientoaconseja la migración a la java.tiempo clases

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

puedes intercambiar java.tiempo objetos directamente con su base de datos. Utilizar una controlador JDBC conforme con JDBC 4.2 o después. No hay necesidad de cuerdas, no hay necesidad de java.sql.* clases

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11y posteriores: parte de la API de Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • La mayoría de java.tiempo la funcionalidad está adaptada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android del java.tiempo clases
    • Para Android anterior (TresDiezABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

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

  • Hola señor, todavía no puedo encontrar la forma correcta de hacer “hace tiempo” para el Instant.

    – Ticherhaz Palestina Libre

    2 jun 2019 a las 19:45

Usar Calendario.

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);

O usando el famoso hora joda biblioteca:

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

Simplemente reste el número de milisegundos en una hora de la fecha.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));

Puede usar el siguiente código para la fecha y la hora:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

Producción :

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

Este enlace es bueno: Mira aquí

Y ver : Ver también

Y : Aquí

Y : Aquí

Y : Aquí

Si solo necesitas tiempo:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

  • FYI: esta respuesta utiliza clases de fecha y hora antiguas y problemáticas que ahora son heredadas, reemplazadas por las clases java.time modernas.

    – Basil Bourque

    25/10/2017 a las 15:36

¿Ha sido útil esta solución?