Como encontro a diferença de dias entre duas instâncias Joda-Time DateTime
? Com "diferença de dias", quero dizer, se o início é na segunda-feira e o fim é na terça-feira, espero um valor de retorno 1, independentemente da hora / minuto / segundo das datas de início e término.
Days.daysBetween(start, end).getDays()
dá-me 0 se o início for à noite e terminar de manhã.
Também estou tendo o mesmo problema com outros campos de data, então esperava que houvesse uma maneira genérica de 'ignorar' os campos de menor importância.
Em outras palavras, os meses entre fevereiro e 4 de março também seriam 1, assim como as horas entre 14:45 e 15:12. No entanto, a diferença horária entre 14:01 e 14:55 seria 0.
Days.daysBetween
incorretos?Instant
, não está falando apenasstart.toInstant()
, está?Days
ClasseUsar a
Days
classe com owithTimeAtStartOfDay
método deve funcionar:fonte
toDateMidnight()
do tipo DateTime está obsoleto.end
for antes dostart
, ele retorna dias negativos?você pode usar
LocalDate
:fonte
toDateMidnight()
do tipo DateTime está obsoleto.new LocalDate(date)
maisdate.toLocalDate()
?tl; dr
…ou…
java.time
Para sua informação, o projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para as classes java.time .
O equivalente a Joda-Time
DateTime
éZonedDateTime
.Aparentemente, você deseja contar os dias por datas, o que significa que deseja ignorar a hora do dia. Por exemplo, iniciar um minuto antes da meia-noite e terminar um minuto depois da meia-noite deve resultar em um único dia. Para esse comportamento, extraia um
LocalDate
do seuZonedDateTime
. ALocalDate
classe representa um valor somente de data, sem hora do dia e sem fuso horário.Use a
ChronoUnit
enumeração para calcular os dias decorridos ou outras unidades.Truncar
Quanto a você perguntar sobre uma maneira mais geral de fazer isso contando onde você está interessado no delta de horas como hora do relógio, em vez de horas completas como tempo de sessenta minutos, use o
truncatedTo
métodoAqui está o seu exemplo das 14:45 às 15:12 no mesmo dia.
Isso não funciona por dias. Use toLocalDate () neste caso.
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 o 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 .O projeto ThreeTen-Extra estende o 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
A resposta aceita cria dois
LocalDate
objetos, que são bastante caros se você estiver lendo muitos dados. Eu uso isso:Ao ligar,
getMillis()
você usa variáveis já existentes.MILLISECONDS.toDays()
depois, usa um cálculo aritmético simples, não cria nenhum objeto.fonte
java.time.Period
Use a
java.time.Period
classe para contar os dias .Como o cálculo do Java 8, a diferença é mais intuitiva
LocalDate
,LocalDateTime
para representar as duas datasfonte
fonte
fonte