Alguém conhece uma maneira simples de usar o calendário Java para subtrair X dias de uma data?
Não consegui encontrar nenhuma função que me permita subtrair diretamente X dias de uma data em Java. Alguém pode me indicar a direção certa?
java
calendar
subtraction
fmsf
fonte
fonte
java.util.Calendar
agora são herdadas , substituídas pelas classes java.time . Consulte o Tutorial da Oracle .Respostas:
Retirado dos documentos aqui :
fonte
Calendar.DAY_OF_MONTH
neste caso, uma vez que ele não lidará com a rolagem entre os meses como você gostaria. Use emCalendar.DAY_OF_YEAR
vez dissoVocê pode usar o
add
método e passar um número negativo. No entanto, você também pode escrever um método mais simples que não use aCalendar
classe, como a seguinteIsso obtém o valor do carimbo de data / hora da data (milissegundos desde a época) e adiciona o número adequado de milissegundos. Você pode passar um número inteiro negativo para o parâmetro days para fazer a subtração. Isso seria mais simples que a solução de calendário "adequada":
Observe que essas duas soluções alteram o
Date
objeto passado como parâmetro em vez de retornar um completamente novoDate
. Qualquer uma das funções pode ser facilmente alterada para fazer o contrário, se desejado.fonte
java.util.Calendar
agora são herdadas , substituídas pelas classes java.time . Consulte o Tutorial da Oracle .A resposta de Anson funcionará bem no caso simples, mas se você quiser fazer cálculos de datas mais complexos, recomendo verificar o Joda Time . Isso tornará sua vida muito mais fácil.
FYI em Joda Time você poderia fazer
fonte
tl; dr
Melhor especificar o fuso horário.
Detalhes
As antigas classes de data e hora incluídas em versões anteriores do Java, como
java.util.Date
/.Calendar
, provaram ser problemáticas, confusas e com falhas. Evite-os.java.time
O Java 8 e versões posteriores substituem essas classes antigas com a nova estrutura java.time. Veja o Tutorial . Definido pelo JSR 310 , inspirado no Joda-Time e estendido pelo projeto ThreeTen-Extra . O projeto ThreeTen-Backport faz o back-port das classes para Java 6 e 7; o projeto ThreeTenABP para Android.
A pergunta é vaga, não está claro se ela pede apenas uma data ou uma data e hora.
LocalDate
Para apenas uma data, sem hora do dia, use o
LocalDate
classe. Observe que um fuso horário é crucial para determinar uma data como "hoje".ZonedDateTime
Se você quis dizer uma data e hora, use a
Instant
classe para obter um momento na linha do tempo no UTC . A partir daí, ajuste para um fuso horário para obter umZonedDateTime
objeto.Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como
Interval
,YearWeek
,YearQuarter
, e mais .fonte
edit: o analisador não parece gostar do link para o Javadoc, então aqui está em texto sem formatação:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
fonte
Em vez de escrever meus próprios,
addDays
conforme sugerido por Eli, eu preferiria usarDateUtils
do Apache . É útil, especialmente quando você precisa usá-lo em vários locais do seu projeto.A API diz:
addDays(Date date, int amount)
Adiciona vários dias a uma data retornando um novo objeto.
Observe que ele retorna um novo
Date
objeto e não faz alterações no próprio anterior.fonte
Isso pode ser feito facilmente pelo seguinte
fonte
LocalDate
é muito mais simples e mais apropriado.Alguém recomendou o Joda Time então - eu tenho usado essa classe CalendarDate http://calendardate.sourceforge.net
É um projeto um tanto competitivo para o Joda Time, mas muito mais básico em apenas 2 aulas. É muito útil e funcionou muito bem para o que eu precisava, pois não queria usar um pacote maior que o meu projeto. Ao contrário dos equivalentes Java, sua menor unidade é o dia, portanto é realmente uma data (não diminuindo em milissegundos ou algo assim). Depois de criar a data, tudo o que você faz para subtrair é algo como myDay.addDays (-5) para voltar 5 dias. Você pode usá-lo para encontrar o dia da semana e coisas assim. Outro exemplo:
E:
fonte
Eu acredito que uma maneira limpa e agradável de executar subtração ou adição de qualquer unidade de tempo (meses, dias, horas, minutos, segundos, ...) possa ser alcançada usando o java.time.Instant classe .
Exemplo para subtrair 5 dias da hora atual e obter o resultado como Data:
Outro exemplo para subtrair 1 hora e adicionar 15 minutos:
Se você precisar de mais precisão, a Instância mede até nanossegundos. Métodos que manipulam parte de nanossegundo:
Além disso, lembre-se de que a data não é tão precisa quanto o instantâneo.
fonte
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Eli Courtwright segunda solução está errada, deve ser:
fonte
addDays
; sua solução está correta. Se você deseja subtrair dias da data, passa um valor negativo paradays
.