Come aggiungo un mese alla data corrente in Java?

In Java, come posso aggiungere un mese alla data corrente?

Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 1); 

Java 8

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

È ansible utilizzare la class di utilità helper DateUtils di apache’s commons lang.

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

È ansible scaricare il barattolo comune di lang all’indirizzo http://commons.apache.org/proper/commons-lang/

tl; dr

 LocalDate::plusMonths 

Esempio:

 LocalDate.now( ) .plusMonths( 1 ); 

Meglio specificare il fuso orario.

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

java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi sostituiscono le vecchie e fastidiose classi data-ora come java.util.Date , .Calendar e java.text.SimpleDateFormat . Il team Joda-Time consiglia anche la migrazione a java.time.

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni.

Gran parte della funzionalità java.time è backportata su Java 6 e 7 in ThreeTen-Backport e ulteriormente adattata ad Android in ThreeTenABP .

Data-only

Se si desidera solo la data, utilizzare la class LocalDate .

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

today.toString (): 2017-01-23

Aggiungi un mese.

 LocalDate oneMonthLater = today.plusMonths( 1 ); 

oneMonthLater.toString (): 2017-02-23

Appuntamento

Forse vuoi un momento del giorno insieme alla data.

Per prima cosa prendi il momento attuale in UTC con una risoluzione di nanosecondi .

 Instant instant = Instant.now(); 

Aggiungere un mese significa determinare le date. E determinare le date significa applicare un fuso orario. Per un dato momento, la data varia in tutto il mondo con un nuovo giorno che si avvicina prima ad est. Quindi aggiusta Instant in un fuso orario.

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

Ora aggiungi il tuo mese. Lascia che java.time gestisca il mese di Leap e il fatto che i mesi abbiano una durata variabile.

 ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 ); 

Si potrebbe voler regolare l’ora del giorno al primo momento della giornata quando si effettua questo tipo di calcolo. Quel primo momento non è sempre 00:00:00.0 quindi lascia che java.time determini l’ora del giorno.

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

A proposito di java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date , Calendar e SimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 e versioni successive
    • Built-in.
    • Parte dell’API Java standard con un’implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra) per Android in particolare.
    • Vedi Come usare ThreeTenABP ….

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval , YearWeek , YearQuarter e altro .


Joda-Time

Aggiornamento: il progetto Joda-Time è ora in modalità di manutenzione. Il suo team consiglia la migrazione alle classi java.time. Sto lasciando intatta questa sezione per i posteri.

La libreria Joda-Time offre un metodo per aggiungere mesi in modo intelligente.

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

Potresti voler concentrarti sul giorno regolando l’ora del giorno al primo momento della giornata.

 DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay(); 
 Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 1); java.util.Date dt = cal.getTime(); 

Usa calander e prova questo codice.

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

(adattato da 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 ; }` 

Puoi usare così;

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

Se hai bisogno di un one-liner (cioè per la formula Jasper Reports) e non importa se l’aggiustamento non è esattamente di un mese (cioè “30 giorni” è sufficiente):

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

Per trovare il giorno dopo un mese, è necessario guardare in quale giorno del mese è oggi.

Quindi se il giorno è il primo giorno del mese, esegui il codice seguente

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

se il giorno è l’ultimo giorno del mese, esegui i seguenti codici.

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

se il giorno è a febbraio, esegui il seguente codice

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

i seguenti codici sono usati per altri casi.

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

Questo metodo restituisce la data corrente più 1 mese.

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