194 votes

Comment soustraire X jours d'une date en utilisant le calendrier Java ?

Quelqu'un connaît-il un moyen simple d'utiliser le calendrier Java pour soustraire X jours d'une date ?

Je n'ai pas réussi à trouver une fonction qui me permette de soustraire directement X jours d'une date en Java. Quelqu'un peut-il m'indiquer la bonne direction ?

0 votes

Pour votre information, les anciennes classes de date-heure gênantes telles que java.util.Calendar sont maintenant héritage supprimé par le java.time classes. Voir Tutoriel par Oracle .

329voto

Anson Smith Points 2905

Tiré de les docs ici :

Ajoute ou soustrait le temps spécifié au champ de calendrier donné, en fonction des règles du calendrier. Par exemple, pour soustraire 5 jours de l'heure actuelle du calendrier, vous pouvez le réaliser en appelant :

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).

1 votes

Faites attention, car il ne roule pas toujours comme vous l'attendez.

1 votes

Cette réponse a beaucoup de votes positifs, mais est-elle sûre à utiliser ? ou ceci est mieux : stackoverflow.com/a/10796111/948268

56 votes

Vous n'utiliseriez pas Calendar.DAY_OF_MONTH dans ce cas, car il ne gérera pas le roulement entre les mois comme vous le souhaiteriez. Utilisez Calendar.DAY_OF_YEAR au lieu de

38voto

Eli Courtwright Points 53071

Vous pourriez utiliser le add et lui transmettre un nombre négatif. Cependant, vous pouvez également écrire une méthode plus simple qui n'utilise pas la méthode Calendar telle que la suivante

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

Elle obtient la valeur de l'horodatage de la date (millisecondes depuis l'époque) et ajoute le nombre approprié de millisecondes. Vous pourriez passer un nombre entier négatif pour le paramètre days afin d'effectuer une soustraction. Ce serait plus simple que la solution du calendrier "correct" :

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

Notez que ces deux solutions modifient le Date passé en tant que paramètre plutôt que de retourner un nouvel objet Date . L'une ou l'autre de ces fonctions pourrait être facilement modifiée pour faire l'inverse si vous le souhaitez.

3 votes

Ne croyez pas que .setTime et .add sont des méthodes statiques de Calendar. Vous devriez utiliser la variable d'instance c.

0 votes

@Edward : vous avez raison, merci de m'avoir signalé mon erreur, j'ai corrigé le code de sorte qu'il devrait maintenant fonctionner correctement.

3 votes

Soyez prudent avec la première méthode, par exemple lorsqu'il s'agit de jours bissextiles, elle peut échouer : stackoverflow.com/a/1006388/32453

36voto

Mike Deck Points 7443

Réponse d'Anson fonctionnera très bien pour les cas simples, mais si vous avez l'intention de faire des calculs de date plus complexes, je vous recommande d'utiliser la fonction Joda Time . Il vous rendra la vie beaucoup plus facile.

Pour info, dans Joda Time, vous pourriez faire

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);

1 votes

@ShahzadImam, vérifiez DateTimeFormat . Elle vous permettra de convertir des instances de DateTime en chaînes de caractères en utilisant des formats arbitraires. Elle est très similaire à la classe java.text.DateFormat.

1 votes

À partir de Java 8, pensez à utiliser java.time. docs.oracle.com/javase/8/docs/api/java/time/

0 votes

Pour info, le Joda-Time Le projet est maintenant en mode de maintenance L'équipe conseille la migration vers le java.time classes. Voir Tutoriel par Oracle .

8voto

matt b Points 73770
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

Voir java.util.Calendar#add(int,int)

5voto

Risav Karna Points 198

Au lieu d'écrire mon propre addDays comme suggéré par Eli, je préfère utiliser DateUtils de Apache . Il est pratique, surtout lorsque vous devez l'utiliser à plusieurs endroits dans votre projet.

L'API dit :

addDays(Date date, int amount)

Ajoute un nombre de jours à une date en retournant un nouvel objet.

Notez qu'il renvoie un nouveau Date et n'apporte pas de modifications à l'objet précédent lui-même.

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