Changement de la date Java une heure en arrière

124

J'ai un objet de date Java:

Date currentDate = new Date();

Cela donnera 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 d'une heure en arrière pour qu'elle me donne:

Thu Jan 12 09:17:47 GMT 2012

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

Makky
la source
y a-t-il un mktimeéquivalent en java? soustraire 60 minutes?
Shiplu Mokaddim

Réponses:

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
la source
La première solution avec Calendar fonctionnerait-elle si l'heure est à minuit d'un jour et que vous voulez une heure d'avance, ce qui est 23 heures le jour précédent?
George Arokiam
1
@GeorgeArokiam oui il le ferait
Kimi
66

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));
Peter Lawrey
la source
3
Bien meilleure solution. La création d'une instance de calendrier semble exagérée dans cette application particulière.
www.Decompiler.com
2
Le calendrier @cosmolev est exagéré dans la plupart des exemples que je trouve.
Peter Lawrey
2
@Stoan J'ai ajouté un exemple plus lisible. Vous devez noter que Calendar est incroyablement inefficace.
Peter Lawrey
@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Cela devrait avoir 10 minutes de retard?
Siya Sosibo le
15

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 Instantclasse.

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 ZonedDateTimeclasse. Vous pouvez commencer avec un instant et attribuer un fuseau horaire, un ZoneIdobjet. 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, YearQuarteret plus .

Basil Bourque
la source
Bonjour monsieur, je ne trouve toujours pas la bonne façon de faire "il y a du temps" pour l'instant.
Ticherhaz
9

Utilisez le calendrier .

Calendar cal = Calendar.getInstance();

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

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

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

Il suffit de soustraire le nombre de millisecondes dans une heure de la date.

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

Sumit Jain
la source
4

Vous pouvez utiliser le code ci-dessous pour la date et l'heure:

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

Production :

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

Ce lien est bon: voir ici

Et voir: Voir aussi

Et: ici

Et: ici

Et: ici

Si vous avez besoin de temps:

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

la source
2
FYI: Cette réponse utilise d'anciennes classes de date-heure gênantes qui sont maintenant héritées, supplantées par les classes java.time modernes.
Basil Bourque
0

Ceci peut être réalisé en utilisant java.util.Date. Le code suivant soustraira 1 heure de votre date.

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

De même pour soustraire 20 secondes de votre date

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

Obtenez l'heure en millisecondes, moins vos minutes en millisecondes et convertissez-la en date. Ici, vous devez en objectiver un !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Zénith
la source
@Makky: Je sais que les choses ont changé. Mais ce n'est pas une mauvaise réponse !!! Pourquoi dites-vous une mauvaise réponse? Avez-vous vu pleinement la réponse acceptée?
Zenith
1
Pourquoi répondriez-vous même à une question qui a 5 ans et qui a accepté la réponse.
Makky
Cette réponse ne fournit aucune valeur au-delà des réponses vieilles de plusieurs années. Et cette réponse utilise imprudemment de terribles vieilles classes de date-heure qui ont été supplantées pendant des années par les classes java.time. Autre problème: cette réponse ignore le problème du fuseau horaire et affiche le code qui utilisera le fuseau horaire par défaut actuel de la JVM alors que la question demandait GMT / UTC. Voir les parties ultérieures de la bonne réponse de Kimi ou voir ma réponse pour plus de discussion.
Basil Bourque
-1

Cela a fonctionné pour moi à la place en utilisant le format .Pour travailler avec le temps, utilisez simplement les méthodes parse et toString ()

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

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

Shahid Hussain Abbasi
la source
1
Cette réponse ne répond pas à la question. La question concerne plus qu'une seule heure de la journée.
Basil Bourque