158 votes

Changer la date de Java une heure en arrière

J'ai un objet de date Java :

Date currentDate = new Date();

Vous obtiendrez ainsi la date et l'heure actuelles. Exemple :

Thu Jan 12 10:17:47 GMT 2012

Au lieu de cela, je veux obtenir la date, en la changeant pour une heure en arrière, ce qui devrait me donner :

Thu Jan 12 09:17:47 GMT 2012

Quelle serait la meilleure façon de procéder ?

0 votes

Y a-t-il un mktime l'équivalent en java ? en soustraire 60 minutes ?

296voto

Kimi Points 2355

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));

10 votes

Il faut savoir qu'il existe Calendar.HOUR qui fonctionne avec une horloge de 12 heures et Calendar.HOUR_OF_DAY pour une horloge de 24 heures : chintat.blogspot.ca/2006/05/

0 votes

La première solution avec le calendrier fonctionnerait-elle si l'heure est minuit un jour et que vous voulez une heure d'avance, soit 23 heures le jour précédent ?

1 votes

@GeorgeArokiam Oui, c'est vrai.

73voto

Peter Lawrey Points 229686

Similaire à la solution de @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

ou

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3 votes

Une bien meilleure solution. La création d'une instance de calendrier semble exagérée dans cette application particulière.

2 votes

@cosmolev Le calendrier est excessif dans la plupart des exemples que je trouve.

2 votes

@Stoan J'ai ajouté un exemple plus lisible. Vous devez noter que Calendar est incroyablement inefficace.

21voto

Basil Bourque Points 8938

En résumé

Sur 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 disposent de la nouvelle java.time cadre intégré.

Instant

Si vous ne vous préoccupez que de l'UTC (GMT), utilisez la fonction Instant classe.

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

Dump à 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 fonction ZonedDateTime classe. Vous pouvez commencer par un instantané, puis attribuer un fuseau horaire, un nom d'utilisateur et un mot de passe. ZoneId objet. Cette classe gère les ajustements nécessaires pour les anomalies telles que 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 à 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[America/Montreal]

zdtHourEarlier: 2015-10-28T19:50:30.778-04:00[America/Montreal]

Conversion

Les anciennes classes java.util.Date/.Calendar sont maintenant dépassées. Évitez-les. Elles sont notoirement gênantes et déroutantes.

Lorsque vous devez utiliser les anciennes classes pour opérer avec un ancien code non encore mis à jour pour les types java.time, appelez les méthodes de conversion. Voici un exemple de code passant d'un Instant ou d'un ZonedDateTime à une 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 site java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date , Calendar , & SimpleDateFormat .

Le site Joda-Time Le projet, actuellement en mode de maintenance conseille la migration vers le java.time classes.

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez sur Stack Overflow de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger java.time directement avec votre base de données. Utilisez un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.* classes.

Où obtenir les classes java.time ?

Le site Trois-Dix-Extra Le projet étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter y plus .

10voto

adarshr Points 25912

Utilisez Calendrier .

Calendar cal = Calendar.getInstance();

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

7voto

Jean Logeart Points 12166

Ou en utilisant le célèbre Joda Time bibliothèque :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X