Как найти разницу в днях между двумя экземплярами Joda-Time DateTime
? Под «разницей в днях» я подразумеваю, если начало в понедельник, а конец во вторник, я ожидаю, что возвращаемое значение равно 1 независимо от часа / минуты / секунд дат начала и окончания.
Days.daysBetween(start, end).getDays()
дает мне 0, если начало вечером и конец утром.
У меня также есть такая же проблема с другими полями даты, поэтому я надеялся, что найдется общий способ «игнорировать» поля меньшей значимости.
Другими словами, месяцы с февраля по 4 марта также будут равны 1, как и часы с 14:45 до 15:12. Однако разница часов между 14:01 и 14:55 будет равна 0.
Days.daysBetween
, неверны?Instant
, вы не просто говоритеstart.toInstant()
, не так ли?Days
КлассИспользование
Days
класса сwithTimeAtStartOfDay
методом должно работать:источник
toDateMidnight()
из типа DateTime устарел.end
доstart
, он возвращает отрицательные дни?Вы можете использовать
LocalDate
:источник
toDateMidnight()
из типа DateTime устарел.new LocalDate(date)
болееdate.toLocalDate()
?ТЛ; др
…или…
java.time
К вашему сведению, проект Joda-Time в настоящее время находится в режиме обслуживания , и команда советует перейти на классы java.time .
Эквивалент Joda-Time
DateTime
естьZonedDateTime
.Очевидно, вы хотите посчитать дни по датам, то есть вы хотите игнорировать время суток. Например, начиная с минуты до полуночи и заканчивая минутой после полуночи, вы получите один день. Для этого поведения, извлеките
LocalDate
из вашегоZonedDateTime
.LocalDate
Класс представляет собой дату только значение без времени суток и без временной зоны.Используйте
ChronoUnit
перечисление, чтобы вычислить прошедшие дни или другие единицы.Округление
Что касается того, что вы спрашиваете о более общем способе подсчета, где вас интересует дельта часов в виде часов, а не полные часы в виде промежутков времени в шестьдесят минут, используйте
truncatedTo
метод.Вот ваш пример с 14:45 до 15:12 в тот же день.
Это не работает в течение нескольких дней. Используйте toLocalDate () в этом случае.
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в
java.sql.*
классах.Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
Принятый ответ создает два
LocalDate
объекта, которые довольно дороги, если вы читаете много данных. Я использую это:При вызове
getMillis()
вы используете уже существующие переменные.MILLISECONDS.toDays()
затем, используя простой арифметический расчет, не создает никакого объекта.источник
java.time.Period
Используйте
java.time.Period
класс для подсчета дней .Поскольку Java 8 вычисление разницы более интуитивно понятно
LocalDate
,LocalDateTime
для представления двух датисточник
источник
источник