tl; dr
En UTC :
Instant.now().minus( 1 , ChronoUnit.HOURS )
Ou, zoné:
Instant.now()
.atZone( ZoneId.of ( "America/Montreal" ) )
.minusHours( 1 )
Utilisation de java.time
Java 8 et les versions ultérieures ont le nouveau framework java.time intégré.
Instant
Si vous ne vous souciez que de UTC (GMT), utilisez la Instant
classe.
Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );
Dump dans la console.
System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );
instant: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z
Notez comment, à cet instant, il est arrivé de revenir à la date d'hier.
ZonedDateTime
Si vous vous souciez d'un fuseau horaire, utilisez la ZonedDateTime
classe. Vous pouvez commencer avec un instant et attribuer un fuseau horaire, un ZoneId
objet. Cette classe gère les ajustements nécessaires pour les anomalies telles que l' heure d'été (DST) .
Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );
Dump dans la console.
System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );
instant: 2015-10-29T00: 50: 30.778Z
zdt: 2015-10-28T20: 50: 30.778-04: 00 [Amérique / Montréal]
zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [Amérique / Montréal]
Conversion
Les anciennes classes java.util.Date/.Calendar sont désormais obsolètes. Évite-les. Ils sont notoirement gênants et déroutants.
Lorsque vous devez utiliser les anciennes classes pour fonctionner avec un ancien code non encore mis à jour pour les types java.time, appelez les méthodes de conversion. Voici un exemple de code allant d'un Instant ou d'un ZonedDateTime à un java.util.Date.
java.util.Date date = java.util.Date.from( instant );
…ou…
java.util.Date date = java.util.Date.from( zdt.toInstant() );
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date
, Calendar
, et SimpleDateFormat
.
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*
classes.
Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .
mktime
équivalent en java? soustraire 60 minutes?