web-dev-qa-db-fra.com

Comment ajouter un mois à la date du jour en Java?

Dans Java Comment puis-je ajouter un mois à la date du jour?

73
kiran
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
100
Piyush Mattoo

Java 8

LocalDate futureDate = LocalDate.now().plusMonths(1);
40
softarn

tl; dr

LocalDate::plusMonths

Exemple:

LocalDate.now( )
         .plusMonths( 1 );

Mieux vaut spécifier le fuseau horaire.

LocalDate.now( ZoneId.of( "America/Montreal" )
         .plusMonths( 1 );

Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure problématiques telles que Java.util.Date, .Calendar, & Java.text.SimpleDateFormat. L'équipe Joda-Time conseille également la migration vers Java.time.

Pour en savoir plus, voir le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité Java.time est rétroportée sur Java 6 & 7 in ThreeTen-Backport et est ensuite adaptée pour Android dans ThreeTenABP .

Date seulement

Si vous voulez la date seulement, utilisez la classe LocalDate.

ZoneId z = ZoneId.of( "America/Montreal" );
 LocalDate today = LocalDate.now( z );

today.toString (): 2017-01-23

Ajouter un mois.

LocalDate oneMonthLater = today.plusMonths( 1 );

oneMonthLater.toString (): 2017-02-23

Date-heure

Vous voulez peut-être une heure avec la date.

D'abord, obtenez le moment actuel dans UTC avec une résolution de nanosecondes .

Instant instant = Instant.now();

Ajouter un mois signifie déterminer les dates. Et déterminer des dates signifie appliquer un fuseau horaire. Pour un moment donné, la date varie à travers le monde avec un nouveau jour se levant plus tôt à l'est. Ajustez donc ce Instant dans un fuseau horaire.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Maintenant, ajoutez votre mois. Laissez Java.time gérer le mois bissextile et le fait que les mois varient en longueur.

ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 );

Vous voudrez peut-être ajuster l'heure du jour au premier moment de la journée lorsque vous effectuez ce type de calcul. Ce premier moment n'est pas toujours 00:00:00.0 donc laissez Java.time déterminer l’heure du jour.

ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId );

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes ennuyeuses héritées telles que - Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , actuellement en mode maintenance , conseille de migrer vers les classes Java.time .

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

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 ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval , YearWeek , YearQuarter , et plus .


Joda-Time

Mise à jour: le projet Joda-Time est maintenant en mode maintenance. Son équipe conseille la migration vers les classes Java.time. Je laisse cette section intacte pour la postérité.

La bibliothèque Joda-Time offre une méthode pour ajouter des mois de manière intelligente.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime now = DateTime.now( timeZone );
DateTime nextMonth = now.plusMonths( 1 );

Vous voudrez peut-être vous concentrer sur la journée en ajustant l'heure au premier moment de la journée.

DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay();
24
Basil Bourque

Vous pouvez utiliser la classe d'utilitaires helper commune DateUtils lang d'Apache.

Date newDate = DateUtils.addMonths(new Date(), 1);

Vous pouvez télécharger commons lang jar sur le site http://commons.Apache.org/proper/commons-lang/

23
mnm
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
Java.util.Date dt = cal.getTime();
9
kelevra88

Utilisez le calendrier et essayez ce code.

Calendar calendar = Calendar.getInstance();         
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
Date nextMonthFirstDay = calendar.getTime();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date nextMonthLastDay = calendar.getTime();
6
Madhuka Dilhan

(adapté de Duggu)

public static Date addOneMonth(Date date)
{
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.MONTH, 1);
    return cal.getTime();
}
3
Bamboomy
public Date  addMonths(String dateAsString, int nbMonths) throws ParseException {
        String format = "MM/dd/yyyy" ;
        SimpleDateFormat sdf = new SimpleDateFormat(format) ;
        Date dateAsObj = sdf.parse(dateAsString) ;
        Calendar cal = Calendar.getInstance();
        cal.setTime(dateAsObj);
        cal.add(Calendar.MONTH, nbMonths);
        Date dateAsObjAfterAMonth = cal.getTime() ;
    System.out.println(sdf.format(dateAsObjAfterAMonth));
    return dateAsObjAfterAMonth ;
}`
3

Si vous avez besoin d'une solution unique (c'est-à-dire pour la formule Jasper Reports) et que l'ajustement ne dure pas exactement un mois ("30 jours" est suffisant):

new Date($F{invoicedate}.getTime() + 30L * 24L * 60L * 60L * 1000L)

2
Brimstedt
    Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();
1
Pradeep nain

Vous pouvez utiliser comme ça;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String d = "2000-01-30";
Date date= new Date(sdf.parse(d).getTime());
date.setMonth(date.getMonth() + 1);
1
harun ugur

Pour trouver le lendemain d'un mois, il faut regarder quel jour du mois on est aujourd'hui.

Donc, si le jour est le premier jour du mois, exécutez le code suivant

Calendar calendar = Calendar.getInstance();

    Calendar calFebruary = Calendar.getInstance();
    calFebruary.set(Calendar.MONTH, Calendar.FEBRUARY);

    if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {// if first day of month
    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
    Date nextMonthFirstDay = calendar.getTime();
    System.out.println(nextMonthFirstDay);

    }

si le jour est le dernier jour du mois, exécutez les codes suivants.

    else if ((calendar.getActualMaximum(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH))) {// if last day of month
    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date nextMonthLastDay = calendar.getTime();
    System.out.println(nextMonthLastDay);
    }

si le jour est en février, lancez le code suivant

    else if (calendar.get(Calendar.MONTH) == Calendar.JANUARY
            && calendar.get(Calendar.DAY_OF_MONTH) > calFebruary.getActualMaximum(Calendar.DAY_OF_MONTH)) {// control of february

    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date nextMonthLastDay = calendar.getTime();
    System.out.println(nextMonthLastDay);

    }

les codes suivants sont utilisés pour les autres cas.

    else { // any day
    calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date theNextDate = calendar.getTime();
    System.out.println(theNextDate);
    }
1
theMind

Cette méthode retourne la date actuelle plus 1 mois.

public Date  addOneMonth()  {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTime();
}`
0