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 .
mktimeequivalente en java? restarle 60 minutos?