Como posso incrementar uma data em um dia em Java?


562

Eu estou trabalhando com uma data neste formato: yyyy-mm-dd.

Como posso incrementar essa data em um dia?


10
Se você estiver usando o Java 8 ou mais recente, poderá usar a nova API de data / hora. Veja esta resposta: stackoverflow.com/a/23910924/1115554
micha

4
new DateTime (). plusDays (1) .toDate () ???
Pietro

Respostas:


686

Algo assim deve fazer o truque:

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) não rolará o mês no último dia do mês.
31711 Sam Hasler

18
@ Ammar, é uma má ideia se você não entendeu nada
niccolo m.

13
Vou citar alguns JavaDocs ... Calendar.DATE: "... Isso é sinônimo de DAY_OF_MONTH." Eu gostaria que os JavaDocs esclarecessem que isso aumentaria campos maiores (como mês e ano). Calendar.roll "Adiciona ou subtrai (para cima / para baixo) uma única unidade de tempo no campo de tempo especificado sem alterar campos maiores". Novamente, "campos maiores" são vagos, mas isso parece consistente com o comentário de Sam. Eu gostaria que houvesse um StackOverflow para corrigir os JavaDocs antigos.
precisa saber é o seguinte

4
infelizmente, é inútil adicionar dias usando DATE, DAY_OF_MONTH ou mesmo DAY_OF_YEAR - todos eles são incrementados por módulo. Portanto, considerando o Calendário de 31-12-1970, add (DAY_OF_YEAR, 1) ou roll (), no entanto roll () finalmente chama add (), fornecerá 01-01-1970. Eu acho que a única maneira correta é acertar o tempo com milissegundos. Quanto a mim, nunca mais uso a classe Calendar.
Dmitry Gryazin

14
@ Bagzerg: Você está errado . add()rolará a data. Veja no ideone .
Jean hominal

212

Java parece estar bem atrás da bola oito em comparação com o C #. Este método utilitário mostra a maneira de fazer no Java SE 6 usando o método Calendar.add (presumivelmente a única maneira fácil).

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

Para adicionar um dia, de acordo com a pergunta, chame da seguinte maneira:

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

4
FYI, os terrivelmente problemáticas aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque

80

java.time

No Java 8 e posterior, o pacote java.time torna isso praticamente automático. ( Tutorial )

Assumindo Stringentrada e saída:

import java.time.LocalDate;

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

3
FYI, tanto ZonedDateDateTimee OffsetDateTimetambém têm plusDayse minusDaysmétodos, bem comoLocalDate
Basil Bourque

@BasilBourque Claro, mas as informações disponíveis na pergunta são as de a LocalDate.
Daniel C. Sobral

2
@DanielCSobral Yep. Basta adicionar links para a edificação dos seus leitores. Não é uma crítica.
Basil Bourque

65

Eu prefiro usar o DateUtils do Apache. Verifique este http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . É útil, especialmente quando você precisa usá-lo em vários locais do seu projeto e não deseja escrever seu método de linha única para isso.

A API diz:

addDays (Data da data, valor int): Adiciona um número de dias a uma data retornando um novo objeto.

Observe que ele retorna um novo objeto Date e não faz alterações no próprio anterior.


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

48

Construa um objeto Calendar e use o método add (Calendar.DATE, 1);


43

Dê uma olhada no 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
Você pode remover as chamadas do analisador para construir o DateTime. Use DateTime date = new DateTime (dateString); NextDay é ISODateTimeFormat.date (). Print (date.plusDays (1)); Consulte joda-time.sourceforge.net/api-release/org/joda/time/… para obter mais informações.
MetroidFan2002 10/01/09

Para obter exemplos de código mais detalhados usando o Joda-Time, consulte minha resposta para uma pergunta semelhante: Como adicionar um dia a uma data? .
Basil Bourque

2
FYI… O projeto Joda-Time agora está no modo de manutenção e aconselha a migração para as classes java.time . Ambos os esforços foram liderados pelo mesmo homem, Stephen Colebourne. Então, eles compartilham conceitos semelhantes e a migração não é difícil.
Basil Bourque 29/07

40

Observe que esta linha adiciona 24 horas:

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

mas essa linha adiciona um dia

cal.add( Calendar.DATE, 1 );

Em dias com mudança de horário de verão (25 ou 23 horas), você obtém resultados diferentes!


40

O Java 8 adicionou uma nova API para trabalhar com datas e horas.

Com o Java 8, você pode usar as seguintes linhas de código:

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

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

1
Eu acho que você quis dizer januaryFirst.plusDays(1)não date.plusDays(1).
TeWu 11/09/16


1
@Subho Para Android antes de 26, consulte o projeto ThreeTenABP que adapta o projeto ThreeTen-Backport , uma porta traseira se a maior parte da funcionalidade de tempo de java para Java 6 e Java 7. #
227 Basil

29

você pode usar a biblioteca java.util simples

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

1
Esta resposta duplica o conteúdo de várias respostas, incluindo a resposta aceita de três anos atrás. Exclua sua resposta ou edite para adicionar valor.
Basil Bourque

3
esta resposta é mais limpa, não analisa a data no meio. a "resposta aceita" é muito complicada. É bom que você adicionou a sua, observação automatizada desrespeito de manjericão
Mickey Perlstein

FYI, os terrivelmente problemáticas aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque

Melhor resposta, direto ao ponto. Eu concordo com o Mickey, apenas desconsidere o comentário de manjericão
eramirez75 27/03

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

Isso dará a data de amanhã. c.add(...)os parâmetros podem ser alterados de 1 para outro número para o incremento apropriado.


1
você pode fazer algo como c.setTime (objeto Date) para definir uma data específica antes de adicionar.
Linh Lino

Eu gostaria que os pacotes java padrão tornassem o manuseio de datas menos complicado ... Quero dizer, é uma dor toda vez que você deseja lidar com datas ... apenas um discurso ...
Shn_Android_Dev

1
@Shn_Android_Dev As classes java.time incorporadas ao Java 8 e posteriores substituem as terríveis classes de data e hora antigas e atendem a seu desejo. Também portado para Java 6/7 e versões anteriores do Android nos projetos ThreeTen-Backport e ThreeTenABP . Não há necessidade de usar Dateou de Calendarnovo.
Basil Bourque 29/07

19

Se você estiver usando o Java 8 , faça assim.

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 você deseja usar o SimpleDateFormat , faça assim.

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

Não, a pergunta solicitou um valor somente de data, não uma data e hora. Portanto, use a LocalDateclasse não LocalDateTime.
Basil Bourque

1
Sua resposta repete o conteúdo de pelo menos quatro outras respostas. Explique como o seu agrega valor além desses ou exclua antes de receber votos negativos.
Basil Bourque

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

Isso leva o número de milissegundos desde a época de oldDate e adiciona 1 dia em milissegundos e usa o construtor público Date () para criar uma data usando o novo valor. Esse método permite adicionar 1 dia ou qualquer número de horas / minutos, não apenas dias inteiros.


Provavelmente não é isso que o OP queria; ele não leva em consideração ajustes no tipo de horário de verão, pula segundos e assim por diante.
mrec 18/09/14

1
O horário de verão deve ser tratado por fuso horário / localidade. Meu exemplo foi mostrar como incrementar em pequenas durações. Ao incrementar por dias, os segundos bissextos podem ser um problema, mas ao adicionar horas, é menos provável, embora ainda seja possível.
dvaey

15

Desde o Java 1.5, o TimeUnit.DAYS.toMillis (1) parece mais limpo para mim.

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

Isso cria um valor de data e hora em que a pergunta solicita apenas uma data. Sugiro que uma abordagem muito mais sábia seja a LocalDateclasse nas classes java.time para Java 8 e posterior, e a porta traseira para Java 6 e Java 7 encontrada no projeto ThreeTen-Backport .
Basil Bourque 24/02


11

No java 8 você pode usar 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

Você pode converter em java.util.Dateobjeto da seguinte maneira.

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

Você pode formatar LocalDateem uma String da seguinte maneira.

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

11

É muito simples, tentando explicar em uma palavra simples. obtenha a data de hoje como abaixo

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

Agora defina um dia com esta data pelo método calendar.add, que leva (constante, valor). Aqui a constante pode ser DATE, horas, min, segundos etc. e value é o valor da constante. Como por um dia, a constante à frente é Calendar.DATE e seu valor é 1 porque queremos o valor de um dia à frente.

System.out.println(calendar.getTime());// print modified date which is data de amanhã

obrigado



7

Apenas passe a data em String e o número dos próximos dias

 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 você deseja adicionar uma única unidade de tempo e espera que outros campos também sejam incrementados, é possível usar o método add com segurança. Veja o exemplo abaixo:

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

Irá imprimir:

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

Não há resposta aceita e senti que havia confusão geral se outros campos também fossem atualizados.
terrmith

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

4
Obrigado por querer contribuir. No entanto, isso já está em várias das outras respostas, então eu realmente não vejo sentido ... Além disso, o IMHO ninguém deve usar a Calendarclasse mal projetada e desatualizada em 2019.
Ole VV

6

Se você usa o Java SE 8 ou superior, deve usar a nova API de Data / Hora

 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 você precisar converter de java.util.Datepara java.time.LocalDate, poderá usar esse método.

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

Se você estiver usando uma versão anterior ao Java SE 8, recomendo que você use o Joda-Time

O Joda-Time fornece uma substituição de qualidade para as classes de data e hora do Java e é a biblioteca de data e hora padrão de fato do Java anterior ao 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
Seu padrão para a java.timepeça está incorreto. Deve ser dd/MM/uuuuequivalente ao JodaTime.
TiiJ7 9/10/19

5

Use a DateFormatAPI para converter a String em um objeto Data e, em seguida, use a CalendarAPI para adicionar um dia. Deixe-me saber se você deseja exemplos de código específicos e posso atualizar minha resposta.


3

Se você estiver usando o Java 8 java.time.LocalDatee java.time.format.DateTimeFormatterpuder fazer esse trabalho bem simples.

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

Ainda mais simples: largue o formatador e use-o toString()para produzir a string no formato aaaa-MM-dd (e se você insistir, lembre-se de que mmsão alguns minutos enquanto MMé o mês).
Ole VV

3

Você pode usar este pacote em "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
Sugerir Dateaula em 2018 é um péssimo conselho. As classes de idade problemáticos de data e hora, como java.util.Date, java.util.Calendar, e java.text.SimpleDateFormatsão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle . Veja outras respostas usando a LocalDateclasse.
Basil Bourque 27/02

Sim, é, LocalDate é a melhor maneira de fazer isso,
Shaheed

no entanto, algumas estruturas, como o jsf, têm alguns problemas de integração com a API time, portanto, às vezes você deve usar o Date; mais ambiente java <8
Lucke

1
@ Lucke A maior parte da funcionalidade java.time foi portada para Java 6 e 7 no projeto ThreeTen-Backport . Mais adaptado ao Android mais antigo no projeto ThreeTenABP . Então, realmente não há necessidade de tocar nessas malditas e horríveis aulas de data e hora. Muitas estruturas foram atualizadas. Mas nem todos. Portanto, se você deve interoperar com o código antigo ainda não atualizado para java.time , escreva seu novo código em java.time e converta para / dos tipos antigos chamando novos métodos de conversão adicionados às classes antigas.
Basil Bourque 29/07

1
Este código ignora a questão crucial do fuso horário . Por um determinado momento, a data varia em torno do globo por zona. A SimpleDateFormatclasse infelizmente injeta um fuso horário, aplicando-se implicitamente zona padrão atual da JVM. Portanto, os resultados desse código variam de acordo com o padrão atual - e esse padrão pode mudar a qualquer momento durante o tempo de execução.
Basil Bourque

3

É simples, na verdade. Um dia contém 86400000 milliSeconds. Então, primeiro você obtém o horário atual em milissegundos do Sistema usando, em System.currentTimeMillis()seguida, adicione os 84000000 milliSeconds e use a DateClasse para gerar um formato de data A para os milissegundos.

Exemplo

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

String Today será 2019-05-9

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

String Tommorow será 2019-05-10

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

O dia em que o dia de cordas chegar amanhã será 2019-05-11


Esse código usa a Dateclasse terrível que foi suplantada anos atrás pelas modernas classes java.time . Muito mais simples de usar, simplesmente:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Basil Bourque

2

Vamos esclarecer o caso de uso: você deseja fazer a aritmética do calendário e iniciar / terminar com um java.util.Date .

Algumas abordagens:

  1. Converter em string e voltar com SimpleDateFormat : Esta é uma solução ineficiente.
  2. Converter em LocalDate : você perderia qualquer informação da hora do dia.
  3. Converter em LocalDateTime : isso envolve mais etapas e você precisa se preocupar com o fuso horário.
  4. Converter em época com Date.getTime () : isso é eficiente, mas você está calculando com milissegundos.

Considere usar java.time.Instant :

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

1
Nunca misture as terríveis classes herdadas, como Dateas modernas classes java.time , como Instant. As classes java.time suplantam totalmente as classes herdadas. InstantSubstitui especificamente java.util.Date.
Basil Bourque

1
Não aborda a questão. Você está usando classes que representam um momento (uma data com hora do dia no contexto de um deslocamento ou zona). Mas a pergunta pergunta apenas por data, sem hora do dia e sem fuso horário. Veja Resposta correta de Sobral e Resposta correta de micha.
Basil Bourque

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

14
fyi, Date.setDate () está obsoleto
Kelly S. francesa

No meu computador, parece funcionar além da borda de um mês. Depois Sun Apr 30 16:25:33 CEST 2017vem Mon May 01 16:25:33 CEST 2017. Ainda é uma solução desanimada. O método não é apenas obsoleto por um bom motivo, também em 2017 temos boas alternativas para a Dateclasse.
Ole VV
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.