Come posso incrementare una data di un giorno in Java?


562

Sto lavorando con una data in questo formato: yyyy-mm-dd.

Come posso aumentare questa data di un giorno?


10
Se si utilizza Java 8 o versioni successive, è possibile utilizzare la nuova API data / ora. Vedi questa risposta: stackoverflow.com/a/23910924/1115554
micha,

4
nuovo DateTime (). plusDays (1) .toDate () ???
Pietro,

Risposte:


686

Qualcosa del genere dovrebbe fare il trucco:

String dt = "2008-01-01";  // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1);  // number of days to add
dt = sdf.format(c.getTime());  // dt is now the new date

50
@Esko, c.roll (Calendar.DATE, true) non scorrerà il mese l'ultimo giorno del mese.
Sam Hasler,

18
@Ammar è una cattiva idea se non capissi nulla
niccolo m.

13
Citerò alcuni JavaDocs ... Calendar.DATE: "... Questo è un sinonimo di DAY_OF_MONTH." Vorrei che JavaDocs chiarisse che questo avrebbe incrementato i campi più grandi (come il mese e l'anno). Calendar.roll "Aggiunge o sottrae (su / giù) una singola unità di tempo nel campo del tempo dato senza cambiare campi più grandi" .. Ancora una volta, "campi più grandi" è vago ma sembra coerente con il commento di Sam. Vorrei che ci fosse uno StackOverflow per riparare vecchi JavaDocs.
jcalfee314,

4
ragazzi, sfortunatamente, è abbastanza inutile aggiungere giorni usando DATE, DAY_OF_MONTH o persino DAY_OF_YEAR - sono tutti incrementati dal modulo. Quindi, considerando il Calendario del 31-12-1970, aggiungi (DAY_OF_YEAR, 1) o roll (), tuttavia roll () infine chiama add (), darà 01-01-1970. Immagino che l'unico modo corretto sia impostare l'ora con i millisecondi. Per quanto mi riguarda, non userò mai più la classe Calendar.
Dmitry Gryazin,

14
@Bagzerg: ti sbagli . add()scorrerà la data. Vedi su ideone .
Jean Hominal,

212

Java sembra essere ben dietro l'ottava palla rispetto a C #. Questo metodo di utilità mostra il modo di fare in Java SE 6 usando il metodo Calendar.add (presumibilmente l'unico modo semplice).

public class DateUtil
{
    public static Date addDays(Date date, int days)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, days); //minus number would decrement the days
        return cal.getTime();
    }
}

Per aggiungere un giorno, per la domanda posta, chiamalo come segue:

String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);

4
Cordiali saluti, le vecchie classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

80

java.time

Su Java 8 e versioni successive, il pacchetto java.time lo rende praticamente automatico. ( Tutorial )

Supponendo Stringinput e output:

import java.time.LocalDate;

public class DateIncrementer {
  static public String addOneDay(String date) {
    return LocalDate.parse(date).plusDays(1).toString();
  }
}

3
Cordiali saluti, entrambi ZonedDateDateTimee OffsetDateTimeanche hanno plusDayse minusDaysmetodi, nonchéLocalDate
Basil Bourque

@BasilBourque Certo, ma le informazioni disponibili nella domanda sono quelle di a LocalDate.
Daniel C. Sobral,

2
@DanielCSobral Yep. Basta aggiungere collegamenti per l'edificazione dei tuoi lettori. Non è una critica.
Basil Bourque,

65

Preferisco usare DateUtils da Apache. Controlla questo http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . È utile soprattutto quando devi usarlo in più punti del tuo progetto e non vorrai scrivere il tuo metodo one liner per questo.

L'API dice:

addDays (Data data, importo int): aggiunge un numero di giorni a una data che restituisce un nuovo oggetto.

Si noti che restituisce un nuovo oggetto Date e non modifica il precedente stesso.


59
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );

48

Costruisci un oggetto Calendar e usa il metodo add (Calendar.DATE, 1);


43

Dai un'occhiata a Joda-Time ( https://www.joda.org/joda-time/ ).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

3
È possibile rimuovere le chiamate del parser per la costruzione di DateTime. Usa DateTime date = new DateTime (dateString); Quindi, nextDay è ISODateTimeFormat.date (). Print (date.plusDays (1)); Vedi joda-time.sourceforge.net/api-release/org/joda/time/… per maggiori informazioni.
MetroidFan2002,

Per un codice di esempio più dettagliato usando Joda-Time, vedi la mia risposta a una domanda simile, Come aggiungere un giorno a una data? .
Basil Bourque,

2
Cordiali saluti ... Il progetto Joda-Time è ora in modalità manutenzione e consiglia la migrazione alle classi java.time . Entrambi gli sforzi furono guidati dallo stesso uomo, Stephen Colebourne. Quindi condividono concetti simili e la migrazione non è difficile.
Basil Bourque,

40

Si noti che questa riga aggiunge 24 ore:

d1.getTime() + 1 * 24 * 60 * 60 * 1000

ma questa riga aggiunge un giorno

cal.add( Calendar.DATE, 1 );

Nei giorni con un cambio dell'ora legale (25 o 23 ore) otterrai risultati diversi!


40

Java 8 ha aggiunto una nuova API per lavorare con date e orari.

Con Java 8 è possibile utilizzare le seguenti righe di codice:

// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");

// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);

1
Immagino tu januaryFirst.plusDays(1)non intendessi date.plusDays(1).
TeWu,


1
@Subho Per Android prima del 26, vedi il progetto ThreeTenABP che adatta il progetto ThreeTen-Backport , un back-port se la maggior parte delle funzionalità java-time a Java 6 e Java 7.
Basil Bourque,

29

puoi usare Simple java.util lib

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();

1
Questa risposta duplica il contenuto di più risposte, inclusa la risposta accettata di tre anni fa. Elimina la tua risposta o modifica per aggiungere valore.
Basil Bourque,

3
questa risposta è più pulita, non analizza la data nel mezzo. la "risposta accettata" è troppo contorta. è bello che tu abbia aggiunto il tuo, ignorando l'osservazione automatica di basilico
Mickey Perlstein,

Cordiali saluti, le vecchie classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

La migliore risposta, direttamente al punto. Sono d'accordo con Topolino,
ignoro

23
Date today = new Date();               
SimpleDateFormat formattedDate = new SimpleDateFormat("yyyyMMdd");            
Calendar c = Calendar.getInstance();        
c.add(Calendar.DATE, 1);  // number of days to add      
String tomorrow = (String)(formattedDate.format(c.getTime()));
System.out.println("Tomorrows date is " + tomorrow);

Questo darà la data di domani. c.add(...)i parametri possono essere cambiati da 1 a un altro numero per l'incremento appropriato.


1
puoi fare qualcosa come c.setTime (oggetto Date) per impostare una data specifica prima di aggiungerla.
Linh Lino,

Vorrei che i pacchetti java predefiniti rendessero le date di gestione meno contorte ... Voglio dire, è un tale dolore ogni volta che vuoi gestire le date ... solo un rant ...
Shn_Android_Dev

1
@Shn_Android_Dev Le classi java.time integrate in Java 8 e successive soppiantano le terribili vecchie classi di data e ora e rispondono al tuo desiderio. Anche il back-port su Java 6/7 e Android precedenti nei progetti ThreeTen-Backport e ThreeTenABP . Non c'è bisogno di usare mai Dateo di Calendarnuovo.
Basil Bourque,

19

Se stai usando Java 8 , fallo in questo modo.

LocalDate sourceDate = LocalDate.of(2017, Month.MAY, 27);  // Source Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format

String destDate = destDate.format(formatter));  // End date

Se vuoi usare SimpleDateFormat , fallo in questo modo.

String sourceDate = "2017-05-27";  // Start date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate)); // parsed date and setting to calendar

calendar.add(Calendar.DATE, 1);  // number of days to add
String destDate = sdf.format(calendar.getTime());  // End date

No, la domanda ha richiesto un valore di sola data non una data-ora. Quindi non usare la LocalDateclasse LocalDateTime.
Basil Bourque,

1
La tua risposta ripete il contenuto di almeno altre quattro risposte. Spiega in che modo il tuo aggiunge valore oltre a questi, oppure elimina prima di raccogliere i voti negativi.
Basil Bourque,

16
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

Questo richiede il numero di millisecondi dall'epoca di oldDate e aggiunge 1 giorno di millisecondi, quindi utilizza il costruttore pubblico Date () per creare una data utilizzando il nuovo valore. Questo metodo consente di aggiungere 1 giorno o qualsiasi numero di ore / minuti, non solo giorni interi.


Questo probabilmente non è ciò che OP voleva; non tiene conto delle regolazioni del tipo di ora legale, dei secondi intercalari e così via.
mrec,

1
L'ora legale dovrebbe essere gestita dal fuso orario / locale. Il mio esempio stava mostrando come aumentare di piccole durate. Quando si incrementa di giorni, saltare i secondi può essere un problema, ma quando si aggiungono le ore, è meno probabile, sebbene sia ancora possibile.
Dvaey,

15

Dal momento che Java 1.5 TimeUnit.DAYS.toMillis (1) mi sembra più pulito.

SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));

Ciò crea un valore data-ora in cui la domanda richiede solo una data. Suggerisco che un approccio molto più saggio è la LocalDateclasse nelle classi java.time per Java 8 e successive, e il back-port per Java 6 e Java 7 trovato nel progetto ThreeTen-Backport .
Basil Bourque,


11

In java 8 puoi usare java.time.LocalDate

LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1);   //Add one to the day field

È possibile convertire in java.util.Dateoggetto come segue.

Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

È possibile formattare LocalDatein una stringa come segue.

String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

11

È molto semplice, cercando di spiegare in una parola semplice. ottieni la data di oggi come di seguito

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);

Ora imposta un giorno in anticipo con questa data con il metodo calendar.add che richiede (costante, valore). Qui la costante potrebbe essere DATA, ore, minuti, secondi ecc. E il valore è il valore della costante. Come per un giorno, la costante in anticipo è Calendar.DATE e il suo valore è 1 perché vogliamo un valore in anticipo di un giorno.

System.out.println(calendar.getTime());// print modified date which is appuntamento di domani

Grazie



7

Basta passare la data in String e il numero dei prossimi giorni

 private String getNextDate(String givenDate,int noOfDays) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        String nextDaysDate = null;
    try {
        cal.setTime(dateFormat.parse(givenDate));
        cal.add(Calendar.DATE, noOfDays);

       nextDaysDate = dateFormat.format(cal.getTime());

    } catch (ParseException ex) {
        Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
    dateFormat = null;
    cal = null;
    }

    return nextDaysDate;

}

7

Se vuoi aggiungere una singola unità di tempo e prevedi che anche altri campi vengano incrementati, puoi tranquillamente usare il metodo add. Vedi l'esempio seguente:

SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, 1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, -1);
System.out.println(simpleDateFormat1.format(cal.getTime()));

Stampa:

1970-12-31
1971-01-01
1970-12-31

Non c'è una risposta accettata e ho pensato che ci fosse confusione generale se anche altri campi fossero aggiornati.
Terrmith,

7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

4
Grazie per voler contribuire. Tuttavia, questo è già in molte altre risposte, quindi non vedo davvero alcun punto ... A parte questo IMHO nessuno dovrebbe usare la Calendarclasse mal progettata e obsoleta nel 2019.
Ole VV

6

Se si utilizza Java SE 8 o versioni successive, è necessario utilizzare la nuova API Data / ora

 int days = 7;       
 LocalDate dateRedeemed = LocalDate.now();
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/YYYY");

 String newDate = dateRedeemed.plusDays(days).format(formatter);   
 System.out.println(newDate);

Se è necessario convertire da java.util.Datea java.time.LocalDate, è possibile utilizzare questo metodo.

  public LocalDate asLocalDate(Date date) {
      Instant instant = date.toInstant();
      ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
      return zdt.toLocalDate();
  }

Se si utilizza una versione precedente a Java SE 8, ti consiglio di utilizzare Joda-Time

Joda-Time fornisce un sostituto di qualità per le classi di data e ora di Java ed è di fatto la libreria standard di data e ora per Java precedente a Java SE 8

   int days = 7;       
   DateTime dateRedeemed = DateTime.now();
   DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/uuuu");

   String newDate = dateRedeemed.plusDays(days).toString(formatter);   
   System.out.println(newDate);

1
Il modello per la java.timeparte non è corretto. Dovrebbe essere dd/MM/uuuuequivalente a quello di JodaTime.
TiiJ7,

5

Utilizzare l' DateFormatAPI per convertire la stringa in un oggetto Date, quindi utilizzare l' CalendarAPI per aggiungere un giorno. Fammi sapere se vuoi esempi di codice specifici e posso aggiornare la mia risposta.


3

Se stai usando Java 8, java.time.LocalDatee java.time.format.DateTimeFormatterpuoi renderlo abbastanza semplice.

public String nextDate(String date){
      LocalDate parsedDate = LocalDate.parse(date);
      LocalDate addedDate = parsedDate.plusDays(1);
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
      return addedDate.format(formatter); 
}

Ancora più semplice: rilascia il formatter e usa solo toString()per produrre la stringa nel formato iyyy-MM-dd (e se insisti, ricorda che mmsono minuti mentre MMè il mese).
Ole VV,

3

Puoi usare questo pacchetto da "org.apache.commons.lang3.time":

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 Date myNewDate = DateUtils.addDays(myDate, 4);
 Date yesterday = DateUtils.addDays(myDate, -1);
 String formatedDate = sdf.format(myNewDate);  

5
Suggerire Dateclasse nel 2018 è un consiglio scadente. Le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle . Vedi altre risposte usando la LocalDateclasse.
Basil Bourque,

Sì, LocalDate È il modo migliore per farlo,
Shaheed,

tuttavia alcuni framework come jsf hanno dei piccoli problemi di integrazione con l'API time quindi a volte dovresti usare Date; plus environment java <8
Lucke

1
@Lucke La maggior parte della funzionalità java.time è stata trasferita su Java 6 e 7 nel progetto ThreeTen-Backport . Adattato ulteriormente al vecchio Android nel progetto ThreeTenABP . Quindi, davvero non c'è bisogno di toccare mai quelle maledette orribili vecchie lezioni di data e ora. Molti framework sono stati aggiornati. Ma non tutto. Quindi, se devi interagire con il vecchio codice non ancora aggiornato a java.time , scrivi il tuo nuovo codice in java.time e convertilo in / dai vecchi tipi chiamando i nuovi metodi di conversione aggiunti alle vecchie classi.
Basil Bourque,

1
Questo codice ignora il problema cruciale del fuso orario . Per ogni dato momento, la data varia intorno al globo per zona. La SimpleDateFormatclasse inietta purtroppo un fuso orario, applicando implicitamente zona predefinita corrente della JVM. Pertanto, i risultati di questo codice variano in base al valore predefinito corrente e tale valore predefinito può cambiare in qualsiasi momento durante il runtime.
Basil Bourque,

3

In realtà è semplice. Un giorno contiene 86400000 milliSecondi. Quindi prima ottieni l'ora corrente in millis dal sistema usando System.currentTimeMillis()quindi aggiungi 84000000 milliSeconds e usa la Dateclasse per generare un formato data per i millisecondi.

Esempio

String Today = new Date(System.currentTimeMillis()).toString();

String Today sarà il 09-05-2019

String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();

String Tommorow sarà il 10-05-2019

String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();

String DayAfterTommorow sarà l'11 / 05/2019


Questo codice usa la terribile Dateclasse che è stata soppiantata anni fa dalle moderne classi java.time . Molto più semplice da usare semplicemente:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Basil Bourque

2

Chiariamo il caso d'uso: vuoi fare l'aritmetica del calendario e iniziare / finire con un java.util.Date .

Alcuni approcci:

  1. Converti in stringa e viceversa con SimpleDateFormat : questa è una soluzione inefficiente.
  2. Converti in LocalDate : perderai qualsiasi informazione sull'ora del giorno.
  3. Converti in LocalDateTime : questo comporta più passaggi e devi preoccuparti del fuso orario.
  4. Converti in epoca con Date.getTime () : questo è efficiente ma stai calcolando con millisecondi.

Prendi in considerazione l'utilizzo di java.time.Instant :

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);

1
Non mischiare mai le classi precedenti terribili come ad esempio Datecon le moderne java.time classi come Instant. Le classi java.time soppiantano completamente le classi legacy. In particolare, Instantsostituisce java.util.Date.
Basil Bourque,

1
Non affronta la domanda. Stai utilizzando le classi che rappresentano un momento (una data con l'ora del giorno nel contesto di un offset o di una zona). Ma la domanda si pone solo sulla data senza ora del giorno e senza fuso orario. Vedi la risposta corretta di Sobral e la risposta corretta di micha.
Basil Bourque,

0
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

14
a proposito, Date.setDate () è obsoleto
Kelly S. francese

Sul mio computer sembra funzionare oltre un mese di confine. Dopo Sun Apr 30 16:25:33 CEST 2017arriva Mon May 01 16:25:33 CEST 2017. È comunque una soluzione scoraggiata. Non solo il metodo è deprecato per una buona ragione, anche nel 2017 abbiamo ottime alternative alla Dateclasse.
Ole VV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.