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 dateSimpleDateFormat sdf =newSimpleDateFormat("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
@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).
publicclassDateUtil{publicstaticDate addDays(Date date,int days){Calendar cal =Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);//minus number would decrement the daysreturn cal.getTime();}}
Para adicionar um dia, de acordo com a pergunta, chame da seguinte maneira:
String sourceDate ="2012-02-29";SimpleDateFormat format =newSimpleDateFormat("yyyy-MM-dd");Date myDate = format.parse(sourceDate);
myDate =DateUtil.addDays(myDate,1);
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.
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!
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 patternLocalDate januaryFirst =LocalDate.parse("2014-01-01");// add one dayLocalDate januarySecond = januaryFirst.plusDays(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();
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
Melhor resposta, direto ao ponto. Eu concordo com o Mickey, apenas desconsidere o comentário de manjericão
eramirez75 27/03
23
Date today =newDate();SimpleDateFormat formattedDate =newSimpleDateFormat("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.
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 DateLocalDate destDate = sourceDate.plusDays(1);// Adding a day to source date.DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy-MM-dd");// Setting date formatString destDate = destDate.format(formatter));// End date
Se você deseja usar o SimpleDateFormat , faça assim.
String sourceDate ="2017-05-27";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("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 addString 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 =newDate(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.
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 .
É 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ã
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 =newSimpleDateFormat("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()));
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.
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);
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.
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":
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:
Converter em string e voltar com SimpleDateFormat : Esta é uma solução ineficiente.
Converter em LocalDate : você perderia qualquer informação da hora do dia.
Converter em LocalDateTime : isso envolve mais etapas e você precisa se preocupar com o fuso horário.
Converter em época com Date.getTime () : isso é eficiente, mas você está calculando com milissegundos.
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 =newDate();
newDate.setDate(newDate.getDate()+1);System.out.println(newDate);
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.
Respostas:
Algo assim deve fazer o truque:
fonte
add()
rolará a data. Veja no ideone .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).
Para adicionar um dia, de acordo com a pergunta, chame da seguinte maneira:
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .java.time
No Java 8 e posterior, o pacote java.time torna isso praticamente automático. ( Tutorial )
Assumindo
String
entrada e saída:fonte
ZonedDateDateTime
eOffsetDateTime
também têmplusDays
eminusDays
métodos, bem comoLocalDate
LocalDate
.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:
Observe que ele retorna um novo objeto Date e não faz alterações no próprio anterior.
fonte
fonte
Construa um objeto Calendar e use o método add (Calendar.DATE, 1);
fonte
Dê uma olhada no Joda-Time ( https://www.joda.org/joda-time/ ).
fonte
Observe que esta linha adiciona 24 horas:
mas essa linha adiciona um dia
Em dias com mudança de horário de verão (25 ou 23 horas), você obtém resultados diferentes!
fonte
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:
fonte
januaryFirst.plusDays(1)
nãodate.plusDays(1)
.você pode usar a biblioteca java.util simples
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .Isso dará a data de amanhã.
c.add(...)
os parâmetros podem ser alterados de 1 para outro número para o incremento apropriado.fonte
Date
ou deCalendar
novo.Se você estiver usando o Java 8 , faça assim.
Se você deseja usar o SimpleDateFormat , faça assim.
fonte
LocalDate
classe nãoLocalDateTime
.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.
fonte
Desde o Java 1.5, o TimeUnit.DAYS.toMillis (1) parece mais limpo para mim.
fonte
LocalDate
classe nas classes java.time para Java 8 e posterior, e a porta traseira para Java 6 e Java 7 encontrada no projeto ThreeTen-Backport .No Java 8, a maneira mais simples de fazer é:
fonte
Instant.now().plus( 1 , ChronoUnit.DAYS )
?No java 8 você pode usar
java.time.LocalDate
Você pode converter em
java.util.Date
objeto da seguinte maneira.Você pode formatar
LocalDate
em uma String da seguinte maneira.fonte
É muito simples, tentando explicar em uma palavra simples. obtenha a data de hoje como abaixo
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
fonte
O Apache Commons já possui este DateUtils.addDays (data da data, valor total) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java .util.Date,% 20int% 29 que você usa ou pode usar o JodaTime para torná-lo mais limpo.
fonte
Apenas passe a data em String e o número dos próximos dias
fonte
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:
Irá imprimir:
fonte
fonte
Calendar
classe mal projetada e desatualizada em 2019.Se você usa o Java SE 8 ou superior, deve usar a nova API de Data / Hora
Se você precisar converter de
java.util.Date
parajava.time.LocalDate
, poderá usar esse método.Se você estiver usando uma versão anterior ao Java SE 8, recomendo que você use o Joda-Time
fonte
java.time
peça está incorreto. Deve serdd/MM/uuuu
equivalente ao JodaTime.Use a
DateFormat
API para converter a String em um objeto Data e, em seguida, use aCalendar
API para adicionar um dia. Deixe-me saber se você deseja exemplos de código específicos e posso atualizar minha resposta.fonte
Se você estiver usando o Java 8
java.time.LocalDate
ejava.time.format.DateTimeFormatter
puder fazer esse trabalho bem simples.fonte
toString()
para produzir a string no formato aaaa-MM-dd (e se você insistir, lembre-se de quemm
são alguns minutos enquantoMM
é o mês).Você pode usar este pacote em "org.apache.commons.lang3.time":
fonte
Date
aula em 2018 é um péssimo conselho. As classes de idade problemáticos de data e hora, comojava.util.Date
,java.util.Calendar
, ejava.text.SimpleDateFormat
são agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle . Veja outras respostas usando aLocalDate
classe.SimpleDateFormat
classe 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.É 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 aDate
Classe 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
fonte
Date
classe 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 )
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:
Considere usar java.time.Instant :
fonte
Date
as modernas classes java.time , comoInstant
. As classes java.time suplantam totalmente as classes herdadas.Instant
Substitui especificamentejava.util.Date
.fonte
Sun Apr 30 16:25:33 CEST 2017
vemMon 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 aDate
classe.