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


Quelqu'un connaît un moyen simple d'utiliser Java calendar pour soustraire X jours d'une date?

Je n'ai pas pu trouver de fonction qui me permette de soustraire directement X jours d'une date en Java. Quelqu'un peut-il me diriger vers la bonne direction?

Author: Joachim Sauer, 2008-10-17

9 answers

Tiré de les documents ici :

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

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).
 269
Author: Anson Smith, 2017-11-29 16:04:05

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

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

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

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 modifiez l'objet Date passé en tant que paramètre plutôt que de renvoyer un Date complètement nouveau. Soit la fonction peut être facilement modifié pour faire dans l'autre sens si vous le souhaitez.

 38
Author: Eli Courtwright, 2014-05-04 10:09:38

La réponse d'Anson fonctionnera bien pour le cas simple, mais si vous allez faire des calculs de date plus complexes, je vous recommande de vérifier Joda Time. Cela rendra votre vie beaucoup plus facile.

Pour INFO en temps Joda, vous pourriez faire

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
 35
Author: Mike Deck, 2017-05-23 11:54:50

Tl; dr

LocalDate.now().minusDays( 10 )

Mieux vaut spécifier le fuseau horaire.

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

Détails

Les anciennes classes date-heure fournies avec les premières versions de Java, telles que java.util.Date/.Calendar, se sont avérés gênants, déroutants et imparfaits. Les éviter.

Java.temps

Java 8 et plus tard supplante ces anciennes classes avec le nouveau java.cadre de temps. Voir Tutoriel. Défini par JSR 310, inspiré par Joda-Time, prolongé par le projet ThreeTen-Extra . Le projet ThreeTen-Backport back-ports les classes vers Java 6 & 7; le projet ThreeTenABP vers Android.

La question est vague, on ne sait pas si elle demande une date seulement ou une date-heure.

LocalDate

Pour une date uniquement, sans heure de la journée, utilisez le LocalDate classe. Notez qu'un fuseau horaire est crucial pour déterminer une date telle que "aujourd'hui".

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

Si vous vouliez dire une date-heure, alors utilisez le Instant classe afin d'obtenir un moment dans le scénario de UTC. De là, ajustez-vous à un fuseau horaire pour obtenir un ZonedDateTime objet.

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

À propos de java.temps

Le java.temps framework est intégré à Java 8 et versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date-heure classes telles que java.util.Date, Calendar, & SimpleDateFormat.

Le Joda-Temps project, maintenant en mode de maintenance, conseille la migration vers le java.temps classes.

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

, Vous pouvez échanger java.temps objets 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.* classe.

Où obtenir le java.les classes de temps?

  • Java SE 8, Java SE 9, Java SE 10, et plus tard
    • Intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Beaucoup de la java.fonction temps est de retour, porté à Java 6 et 7ThreeTen-Backport.
  • Android
    • Versions ultérieures des implémentations Android bundle de java.les classes de temps.
    • Pour Android antérieur (Troisabp le projet adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser Troisabp....

Le Trois-Extra le projet étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.temps. Vous pouvez trouver quelques classes utiles ici comme Interval, YearWeek, YearQuarter, et plus.

 10
Author: Basil Bourque, 2018-04-23 05:27:28
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

Edit: l'analyseur ne semble pas aimer le lien vers le Javadoc, donc le voici en clair:

Http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int, int)

 5
Author: matt b, 2008-10-17 14:31:53

, au Lieu d'écrire mon propre addDays tel que suggéré par Eli, je préfère utiliser DateUtils à partir 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 renvoyant un nouvel objet.

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

 5
Author: Risav Karna, 2012-09-27 17:27:13

Quelqu'un recommandé Joda Temps, donc - j'ai été en utilisant ce CalendarDate classe http://calendardate.sourceforge.net

C'est un projet quelque peu concurrent de Joda Time, mais beaucoup plus basique à seulement 2 classes. C'est très pratique et a très bien fonctionné pour ce dont j'avais besoin car je ne voulais pas utiliser un paquet plus grand que mon projet. Contrairement aux homologues Java, sa plus petite unité est le jour, donc c'est vraiment une date (ne pas l'avoir en millisecondes ou quelque chose du genre). Une fois que vous créez la date, tout ce que vous faites pour soustraire est quelque chose comme myDay.addDays (-5) pour revenir en arrière 5 jours. Vous pouvez l'utiliser pour trouver le jour de la semaine et des choses comme ça. Un autre exemple:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

Et:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}
 1
Author: mikato, 2011-10-27 20:33:46

La deuxième solution d'Eli Courtwright est fausse, elle devrait être:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
 0
Author: user178973, 2009-09-25 09:30:16

Cela peut être fait facilement par ce qui suit

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());
 0
Author: rab, 2017-12-19 06:37:01