Cambiar la fecha de Java hace una hora

124

Tengo un objeto de fecha de Java:

Date currentDate = new Date();

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

Thu Jan 12 10:17:47 GMT 2012

En cambio, quiero obtener la fecha, cambiándola a una hora atrás para que me dé:

Thu Jan 12 09:17:47 GMT 2012

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

Makky
fuente
¿hay algún mktimeequivalente en java? restarle 60 minutos?
Shiplu Mokaddim

Respuestas:

243

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.time.Instant

// 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));
Kimi
fuente
8
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/…
Wolf
¿Funcionaría la primera solución con Calendar si la hora es la medianoche de un día y desea una hora antes, que son las 11 pm del día anterior?
George Arokiam
1
@GeorgeArokiam sí lo haría
Kimi
66

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));
Peter Lawrey
fuente
3
Solución mucho mejor. La creación de instancias de calendario parece excesiva en esta aplicación en particular.
www.Decompiler.com
2
@cosmolev Calendar es excesivo en la mayoría de los ejemplos que encuentro.
Peter Lawrey
2
@Stoan He agregado un ejemplo más legible. Debe tener en cuenta que Calendar es increíblemente ineficiente.
Peter Lawrey
@PeterLawrey ¿ Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Esto debería tener un retraso de 10 minutos?
Siya Sosibo
15

tl; dr

En UTC :

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

O, dividido en zonas:

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

Usando java.time

Java 8 y versiones posteriores tienen incorporado el nuevo marco java.time .

Instant

Si solo te importa UTC (GMT), usa la Instantclase.

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

Volcar a la consola.

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

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

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

ZonedDateTime

Si te importa una zona horaria, usa la ZonedDateTimeclase. Puede comenzar con un Instant y asignar una zona horaria, un ZoneIdobjeto. Esta clase maneja los ajustes necesarios para anomalías como el 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 );

instantáneo: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [América / Montreal]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [América / Montreal]

Conversión

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

Cuando deba usar las clases antiguas para operar con código antiguo que aún no se ha actualizado para los tipos java.time, llame a los métodos de conversión. A continuación, se muestra 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() );

Acerca 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, ySimpleDateFormat .

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. Sin necesidad de cuerdas, sin necesidad dejava.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 .

Albahaca Bourque
fuente
Hola señor, todavía no puedo encontrar la manera correcta de hacer "tiempo atrás" para el Instant.
Ticherhaz
9

Utilice el calendario .

Calendar cal = Calendar.getInstance();

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

O usando la famosa biblioteca Joda Time :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Jean Logeart
fuente
5

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

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

Sumit Jain
fuente
4

Puede utilizar 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()));

Salida:

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: ver aquí

Y mira: mira también

Y: Aquí

Y: Aquí

Y: Aquí

Si solo necesita tiempo:

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

fuente
2
Para su información: esta respuesta utiliza antiguas clases de fecha y hora problemáticas que ahora son heredadas, suplantadas por las clases modernas de java.time.
Basil Bourque
0

Esto se puede lograr usando java.util.Date. El siguiente código restará 1 hora de su fecha.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

Similarmente para restar 20 segundos de su cita

newDate = DateUtils.addSeconds(date, -20)    
Dhananjay
fuente
-1

Obtenga el tiempo en milisegundos, menos sus minutos en milisegundos y conviértalo en fecha. Aquí tienes que objetivar uno !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Cenit
fuente
@Makky: Sé que las cosas han cambiado. ¡Pero no es una respuesta incorrecta! ¿Por qué le dice a esto una respuesta incorrecta? ¿Viste la respuesta aceptada por completo?
Zenith
1
¿Por qué respondería a una pregunta que tiene 5 años y ha aceptado la respuesta?
Makky
Esta respuesta no proporciona ningún valor más allá de las respuestas de años existentes. Y esta respuesta utiliza imprudentemente clases de fecha y hora antiguas terribles que han sido suplantadas durante años por las clases java.time. Otro problema: esta Respuesta ignora el problema de la zona horaria y muestra el código que usará la zona horaria predeterminada actual de la JVM mientras la Pregunta solicitó GMT / UTC. Vea las últimas partes de la Respuesta correcta de Kimi o vea mi Respuesta para más discusión.
Basil Bourque
-1

Me funcionó en lugar de usar el formato .Para trabajar con el tiempo, solo use los métodos parse y toString ()

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (localtime)

LocalTime lt = 6:11; localTime = lt.toString ()

Shahid Hussain Abbasi
fuente
1
Esta respuesta no aborda la pregunta. La Pregunta trata sobre algo más que un momento del día solo.
Basil Bourque