Dans Java Comment puis-je ajouter un mois à la date du jour?
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
Java 8
LocalDate futureDate = LocalDate.now().plusMonths(1);
LocalDate::plusMonths
Exemple:
LocalDate.now( )
.plusMonths( 1 );
Mieux vaut spécifier le fuseau horaire.
LocalDate.now( ZoneId.of( "America/Montreal" )
.plusMonths( 1 );
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 .
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
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 );
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 .
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();
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/
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
Java.util.Date dt = cal.getTime();
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();
(adapté de Duggu)
public static Date addOneMonth(Date date)
{
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, 1);
return cal.getTime();
}
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 ;
}`
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)
Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();
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);
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);
}
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();
}`