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?
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
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
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
, YearQuarter
y 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
Hay alguna
mktime
equivalente en java? restarle 60 minutos?– Shiplu Mokaddim
12 de enero de 2012 a las 10:21