tl; dr
Em UTC :
Instant.now().minus( 1 , ChronoUnit.HOURS )
Ou, zoneado:
Instant.now()
.atZone( ZoneId.of ( "America/Montreal" ) )
.minusHours( 1 )
Usando java.time
Java 8 e posterior tem a nova estrutura java.time integrada.
Instant
Se você se preocupa apenas com o UTC (GMT), use a Instant
classe.
Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );
Despeje para o console.
System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );
instantâneo: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z
Observe como, neste instante, voltou para a data de ontem.
ZonedDateTime
Se você se preocupa com um fuso horário, use a ZonedDateTime
classe. Você pode começar com um Instant e atribuir um fuso horário, um ZoneId
objeto. Esta classe lida com os ajustes necessários para anomalias, como horário de verão (DST) .
Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );
Despeje para o console.
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 [America / Montreal]
Conversão
As antigas classes java.util.Date/.Calendar estão desatualizadas. Evite-os. Eles são notoriamente problemáticos e confusos.
Quando você deve usar as classes antigas para operar com código antigo ainda não atualizado para os tipos java.time, chame os métodos de conversão. Aqui está um exemplo de código indo de um Instant ou um ZonedDateTime para um java.util.Date.
java.util.Date date = java.util.Date.from( instant );
…ou…
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de java.sql.*
classes.
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .
mktime
equivalente em java? subtrair 60 minutos disso?