Находим разницу между двумя датами в Java
Разница в днях между двумя датами в Java?
мне нужно найти количество дней между двумя датами: один из отчета, а другой-текущая дата. Мой фрагмент:
здесь calculateDifference является частным методом, agingDate и today are Date объекты, просто для уточнения. Я следил за двумя статьями с форума Java,резьба 1 / резьба 2.
он отлично работает в Автономной программе, хотя когда я включаю это в свою логику для чтения из сообщаю, что получаю необычную разницу в ценностях.
почему это происходит и как я могу это исправить?
EDIT:
Я получаю большее количество дней по сравнению с фактическим количеством дней.
Примечание :
к сожалению, ни один из ответов помог мне решить проблему. Я достиг проблема С помощью Joda времени библиотека.
20 ответов
Я бы предложил вам использовать отличный Джода Времени библиотека вместо дефектной java.утиль.Свидание и друзья. Вы могли бы просто написать
Я, возможно, слишком поздно, чтобы присоединиться к игре, но какого черта? 🙂
Как вы думаете, это проблема с потоками? Как вы используете вывод этого метода, например? Или
можем ли мы изменить ваш код, чтобы сделать что-то простое, как:
diff / (24 * etc) не учитывает часовой пояс, поэтому, если в вашем часовом поясе по умолчанию есть DST, он может сбросить расчет.
этой ссылке есть миленький реализации.
вот источник приведенной выше ссылки в случае, если ссылка идет вниз:
java.время
в Java 8 и более поздних, используйте java.временные рамки (учебник).
Duration
на Duration класс представляет промежуток времени как количество секунд плюс дробная секунда. Он может считать дни, часы, минуты и секунды.
ChronoUnit
если все, что вам нужно, это количество дней, в качестве альтернативы вы можете использовать ChronoUnit перечисление. Обратите внимание, что методы расчета возвращают long , а не int .
Это зависит от того, что вы определите как разницу. Сравнить две даты в полночь можно.
решение, использующее разницу между миллисекундами времени, с правильным округлением для дат DST:
одно примечание: конечно, даты должны быть в некотором часовом поясе.
Если вы не хотите раунд, вы можете использовать даты UTC,
иллюстрация проблемы: (мой код вычисляет дельту в неделях, но та же проблема применяется к Дельте в днях)
вот очень разумно выглядящая реализация:
но этот тест не получится:
Пн 09 марта 00:00: 00 EDT 2009 = 1,236,571,200,000
Пн 23 Февраля 00: 00: 00 EST 2009 = 1,235,365,200,000
MillisPerWeek = 604,800,000
таким образом,
(Mar09 – Feb23) / MillisPerWeek =
1,206,000,000 / 604,800,000 = 1.994.
но любой, кто смотрит на календарь, согласится, что ответ 2.
Я использую эту функцию:
посмотреть getFragmentInDays методы в этом классе Apache commons-lang DateUtils .
основываясь на ответе @Mad_Troll, я разработал этот метод.
Я запустил около 30 тестовых случаев против него, это единственный метод, который обрабатывает фрагменты суб-дневного времени правильно.
пример: если вы проходите сейчас и сейчас + 1 миллисекунда, это все тот же день. Делать 1-1-13 23:59:59.098 to 1-1-13 23:59:59.099 возвращает 0 дней, правильно; выделение других методов, размещенных здесь, не будет делать это правильно.
стоит отметить, что он не заботится о том, каким образом вы их поместите, если ваша дата окончания перед вашей датой начала он будет отсчитываться назад.
вы можете удалить @NotNull аннотации, они используются Intellij для анализа кода на лету
вы говорите, что он” отлично работает в Автономной программе”, но вы получаете” необычные значения разницы”, когда вы”включаете это в мою логику для чтения из отчета”. Это говорит о том, что ваш отчет имеет некоторые значения, для которых он работает неправильно, и ваша автономная программа не имеет этих значений. Вместо отдельной программы, я предлагаю тест. Напишите тестовый случай так же, как и отдельную программу, подкласс из класса TestCase JUnit. Теперь вы можете запустить очень специфический например, зная, какое значение вы ожидаете (и не давайте его сегодня для тестового значения, потому что сегодня меняется со временем). Если вы введете значения, которые вы использовали в Автономной программе, ваши тесты, вероятно, пройдут. Это здорово – вы хотите, чтобы эти дела продолжали работать. Теперь добавьте значение из вашего отчета, которое работает неправильно. Ваш новый тест, вероятно, провалится. Выясните, почему он терпит неудачу, исправьте его и получите зеленый цвет (все тесты проходят). Запустите отчет. Посмотрите, что все еще сломано; напишите тест; пусть пройдет. Очень скоро вы обнаружите, что ваш отчет работает.
ISO 8601
Мы должны разобрать твои строки. Классы java.time по умолчанию используют стандартные форматы ISO 8601 при разборе / генерации строк. Ваш вклад близок к соблюдению; нам просто нужно заменить пространство в середине с T .
LocalDateTime
В ваших входах отсутствуют какие-либо признаки смещения от UTC или часового пояса. Таким образом, они не представляют фактические моменты на временной шкале, только смутное представление о возможных моментах на временной шкале. Поэтому мы будем разбирать это как LocalDateTime объекты. Математика, которую мы будем выполнять для определения промежутков времени, будет основана на общих 24-часовых днях и будет игнорировать такие аномалии, как летнее время (DST) .
Period & Duration
Классы java.time определяют промежуток времени, не привязанный к временной шкале, как две части. Period Класс представляет лет-месяцев-дней, в то время как Duration класс представляет часы-минуты-секунды.
Разделение промежутка времени на эти две части позволяет избежать определенных проблем, которые мы должны решить, чтобы решить ваш запрос. Как именно вы хотите обработать, возможно, неполный день в первый день и, возможно, неполный день в конце? Полдень от одного дня до полудня следующего дня – это один день или 24 часа? Если мы суммируем часы первого дня с часами последнего дня, должны ли мы выжать целый день, если это число превышает 24 часа?
расчета
Здесь я использую подход, согласно которому мы считаем количество целых дней, игнорируя первый день и последний день. Затем я суммирую количество часов в первый день с количеством часов в последний день. Как видно из данных вашего примера, это может занять более 24 часов Duration . Этот подход может соответствовать или не соответствовать вашим неустановленным намерениям / определениям.
Дамп на консоль. Эти toString методы на Period & Duration класса генерирует строки в формате стандартных длительностей ИСО 8601: PnYnMnDTnHnMnS где P отмечает начало и T разделяет годы-месяц-дней от часы-минуты-секунды.
начало / остановка: 2017-01-23T05: 25 / 2018-03-20T07: 29: 50
dStart: PT18H35M и dStop: PT7H29M50S
Чтобы получить желаемый текстовый вывод, вам нужно запросить каждую часть Period и каждую часть Duration .
В Java 8 по необъяснимым причинам отсутствуют методы для удобного получения каждой части, часов, минут или секунд Duration . Java 9 добавляет такие методы. Смотрите этот вопрос для дальнейшего обсуждения.
Живой код
ZonedDateTime
Обсуждение выше было для общих 24-часовых дней, игнорируя проблему смещения от UTC / часового пояса.
Если вместо этого вы хотите отслеживать фактические моменты на временной шкале, вы должны применить часовой пояс, предназначенный для этих строк даты и времени.
Остальная часть кода будет похожа, но пройти ZoneId к atStartOfDay вызовы для создания ZonedDateTime объекта , а не LocalDateTime объект.
Имейте в виду, что вы можете получить разные результаты при использовании ZonedDateTime объектов, а не LocalDateTime объектов.
Совет: библиотека ThreeTen-Extra предлагает класс Interval для отслеживания пары Instant объектов. Это Instant момент на временной шкале в UTC. Вы можете извлечь Instant из ZonedDateTime , позвонив toInstant .
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date , Calendar , и SimpleDateFormat .
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Учебник по Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Разница между двумя датами в Java
1. Обзор
В этой быстрой статье мы рассмотрим различные возможности вычисления разницы между двумя датами в Java.
2. Базовая Java
2.1. Использование java.util.Date для определения разницы в днях
Начнем с использования основных API-интерфейсов Java для расчета и определения количества дней между двумя датами:
2.2. Использование java.time – начиная с Java 8
Теперь вычисление разницы более интуитивно понятно, если мы используем LocalDate, LocalDateTime для представления двух дат (со временем или без) в сочетании с Period и Duration:
ссылка:/java-8-date-time-intro[Здесь]немного подробнее об этом API.
2.3. Использование java.time.temporal.ChronoUnit для нахождения разницы в секундах
API времени в Java 8 представляет собой единицу даты и времени, например секунд или дней, используя __https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalUnit.html[TemporalUnit] __interface.
Каждый модуль предоставляет реализацию для метода с именем https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalUnit.html#between-java.time.temporal.Temporal-java . time.temporal.Temporal -[ Между ], чтобы вычислить количество времени между двумя временными объектами в терминах этой конкретной единицы ** .
Например, чтобы вычислить секунды между двумя __LocalDateTime __s:
ChronoUnit предоставляет набор конкретных единиц времени путем реализации интерфейса TemporalUnit . Настоятельно рекомендуется static import значения ChronoUnit enum для достижения большей читабельности:
Кроме того, мы можем передать любые два совместимых временных объекта методу _between , даже ZonedDateTime._
Что хорошего в ZonedDateTime , так это то, что вычисления будут работать, даже если для них установлены разные часовые пояса:
2.4. Использование java.time.temporal.Temporal until ()
Любой объект Temporal , например, _LocalDate или ZonedDateTime, предоставляет https://docs.oracle.com/javase/8/docs/api/java/time/temporal/Temporal.html#until-java.time.temporal.Temporal-java.time .temporal.TemporalUnit -[ till_ ]метод для вычисления количества времени до другого временного с точки зрения указанной единицы:
Temporal # till и _TemporalUnit # между ___ представляют собой два разных API для одной и той же функциональности.
3. Внешние библиотеки
3.1. JodaTime
Мы также можем сделать относительно простую реализацию с JodaTime :
Вы можете получить последнюю версию Joda-time от Maven Central.
Точно так же с LocalDateTime это:
3.2. Date4J
Date4j также обеспечивает простую и простую реализацию, не учитывая, что в этом случае нам нужно явно предоставить TimeZone.
Давайте начнем с зависимости Maven:
Вот быстрый тест, работающий со стандартным DateTime :
4. Заключение
В этом руководстве мы проиллюстрировали несколько способов вычисления разницы между датами (со временем и без него) как в простой Java, так и с использованием внешних библиотек.
Полный исходный код статьи доступен по адресу over на GitHub .
Разница во времени между двумя датами в Java? – java
Мне нужно найти количество дней между двумя датами: одно из отчета, а другое – текущая дата. Мой фрагмент:
Здесь calculateDifference – частный метод, agingDate и today являются объектами Date , только для вашего разъяснения. Я следил за двумя статьями с форума Java, Thread 1/Тема 2.
Он отлично работает в автономной программе, хотя, когда я включаю это в свою логику, чтобы читать из отчета, я получаю необычное различие в значениях.
Почему это происходит и как я могу это исправить?
EDIT:
Я получаю большее количество дней по сравнению с фактическим количеством дней.
Примечание:
К сожалению, ни один из ответов не помог мне решить проблему. Я выполнил эту проблему с помощью Joda-time библиотека.
- 13
- 20
- 12 окт 2019 2019-10-12 20:29:38
- Venkat
20 ответов
Я сделал это так. это легко:)
- 12 окт 2019 2019-10-12 20:29:44
- Dayadra Lakmal
Этот код вычисляет дни между двумя строками даты:
- 12 окт 2019 2019-10-12 20:29:44
- Kayvan Tehrani
- 12 окт 2019 2019-10-12 20:29:43
- M. S.
Если вы ищете решение, которое возвращает правильное число или дни между, например, 11/30/2014 23:59 и 12/01/2014 00:01 здесь, используя Joda Time.
Эта реализация вернет 1 как разницу в днях. Большинство решений, размещенных здесь, вычисляют разницу в миллисекундах между двумя датами. Это означает, что 0 будет возвращен, потому что разница между этими двумя датами составляет всего 2 минуты.
- 12 окт 2019 2019-10-12 20:29:43
- tomrozb
Вы должны использовать библиотеку времени Joda, потому что Java Util Date иногда возвращает неправильные значения.
Joda vs Java Util Date
Например, дни между вчерашним днем (dd-mm-yyyy, 12-07-2016) и первым днем года в 1957 году (dd-mm-yyyy, 01-01-1957):
Поэтому я действительно советую вам использовать библиотеку времени Joda.
- 12 окт 2019 2019-10-12 20:29:43
- Šime Tokić
- 12 окт 2019 2019-10-12 20:29:43
- user1091978
ThreeTen-Extra
Ответ Виталия Федоренко правилен, описывая, как выполнить этот расчет современным способом java.time ( Duration и ChronoUnit ), встроенный в Java 8 и более поздние версии (и back-ported на Java 6 и 7 и для Android).
Если вы регулярно используете в своем коде несколько дней, вы можете заменить простые целые числа на использование класса. Класс Days можно найти в ThreeTen-Extra, расширение java.time и доказательство возможных будущих дополнений к java.time. Класс Days обеспечивает безопасный способ представления количества дней в вашем приложении. Класс включает удобные константы для ZERO и ONE .
Учитывая старые устаревшие объекты java.util.Date в Вопросе, сначала преобразуйте их в современные java.time.Instant . В старых классах времени есть новые методы, облегчающие преобразование в java.time, например java.util.Date::toInstant .
Передайте оба объекта Instant методу factory для org.threeten.extra.Days .
В текущей реализации (2016-06) это оболочка, вызывающая java.time.temporal.ChronoUnit.DAYS.between , прочитайте документ класса ChronoUnit для подробностей, Чтобы быть ясным: все прописные буквы Days находятся в перечислении ChronoUnit , а начальная cap Days – это класс из ThreeTen-Extra.
Вы можете передать эти объекты Days вокруг своего собственного кода. Вы можете сериализовать строку String в стандартном формате ISO 8601, вызвав toString . Этот формат PnD использует P для обозначения начала, а D означает “дни”, с несколькими днями между ними. Оба класса java.time и ThreeTen-Extra используют эти стандартные форматы по умолчанию при создании и анализе строк, представляющих значения даты и времени.
- 12 окт 2019 2019-10-12 20:29:43
- Basil Bourque
Вы говорите, что “отлично работает в автономной программе”, но вы получаете “необычные значения различий”, когда вы “включаете это в свою логику для чтения из отчета”. Это говорит о том, что ваш отчет имеет некоторые значения, для которых он работает неправильно, а ваша автономная программа не имеет этих значений. Вместо автономной программы я предлагаю тестовый пример. Запишите тестовый пример так же, как и автономную программу, подклассы из класса JUnit TestCase. Теперь вы можете запустить очень конкретный пример, зная, какое значение вы ожидаете (и не даете его сегодня для тестового значения, потому что сегодня меняются со временем). Если вы добавите значения, которые вы использовали в автономной программе, ваши тесты, вероятно, пройдут. Это здорово – вы хотите, чтобы эти дела продолжали работать. Теперь добавьте значение из своего отчета, которое не работает правильно. Ваш новый тест, скорее всего, не удастся. Выясните, почему это не удается, исправить и перейти на зеленый (все тесты проходят). Запустите отчет. Посмотрите, что еще сломано; написать тест; заставьте его пройти. Довольно скоро вы обнаружите, что ваш отчет работает.
Разница в днях между двумя датами в Java году?
Мне нужно найти количество дней между двумя датами: одна-из отчета, а другая-текущая дата. Мой фрагмент:
Здесь calculateDifference -частный метод, agingDate и today -объекты Date , просто для вашего разъяснения. Я следил за двумя статьями из форума Java, поток 1 / поток 2 .
Он прекрасно работает в Автономной программе, хотя когда я включаю это в свою логику, чтобы прочитать отчет, я получаю необычную разницу в значениях.
Почему это происходит и как я могу это исправить?
EDIT :
Я получаю большее количество дней по сравнению с фактическим количеством дней.
Примечание :
К сожалению, ни один из ответов не помог мне решить эту проблему. Я решил эту проблему с помощью библиотеки времени Джоды.
20 Ответов
Я бы посоветовал вам использовать отличную библиотеку времени Джоды вместо ущербного java.util.Date и друзей. Вы могли бы просто написать
Может быть, я и опоздал присоединиться к игре, но какого черта? 🙂
Как вы думаете, это проблема с потоками? Как вы используете выходные данные этого метода, например? OR
Можем ли мы изменить ваш код, чтобы сделать что-то столь же простое, как:
diff / (24 * etc) не учитывает Timezone, так что если ваш default timezone имеет в нем DST, он может сбросить расчет.
Эта ссылка имеет приятную маленькую реализацию.
Вот источник вышеупомянутой ссылки на случай, если ссылка пойдет вниз:
java.time
В Java 8 и более поздних версиях используйте фреймворк java.time ( учебник ).
Duration
Класс Duration представляет промежуток времени в виде числа секунд плюс дробная секунда. Он может считать дни, часы, минуты и секунды.
ChronoUnit
Это зависит от того, что вы определяете как разницу. Сравнить две даты в полночь вы можете сами.
Решение с использованием разницы между миллисекундами времени, с правильным округлением для DST дат:
Одно замечание: конечно, даты должны быть в каком-то timezone.
Если вы не хотите округлять, вы можете использовать UTC дат,
Иллюстрация проблемы: (мой код вычисляет дельту в неделях, но та же проблема относится и к Дельте в днях)
Вот очень разумная на вид реализация:
Но этот тест провалится:
Пн Мар 09 00:00:00 EDT 2009 = 1,236,571,200,000
Пн 23 Февраля 00:00:00 EST 2009 = 1,235,365,200,000
MillisPerWeek = 604,800,000
Таким образом,
(Mar09 – Feb23) / MillisPerWeek =
1,206,000,000 / 604,800,000 = 1.994.
но любой, кто смотрит на календарь, согласится, что ответ-2.
Я использую эту функцию:
Посмотрите на getFragmentInDays методов в этом apache commons-lang классе DateUtils .
Основываясь на ответе @Mad_Troll’s, я разработал этот метод.
Я запустил около 30 тестовых случаев против него, это единственный метод, который правильно обрабатывает фрагменты времени субдня.
Стоит отметить, что он не заботится о том, каким образом вы их ставите, если ваша конечная дата находится перед вашей начальной датой, он будет отсчитываться назад.
Вы можете удалить аннотации @NotNull , они используются Intellij для анализа кода на лету
Вы говорите, что это “works fine in a standalone program,”, но что вы получаете “unusual difference values”, когда вы “include this into my logic to read from report”. Это означает, что ваш отчет имеет некоторые значения, для которых он не работает правильно, и ваша автономная программа не имеет этих значений. Вместо отдельной программы я предлагаю тестовый случай. Напишите тестовый случай так же, как если бы Вы были самостоятельной программой, подклассом из класса JUnit TestCase. Теперь вы можете запустить очень конкретный пример, зная, какое значение вы ожидаете (и не давайте его сегодня для тестового значения, потому что сегодня меняется с течением времени). Если вы введете значения, которые вы использовали в Автономной программе,ваши тесты, вероятно, пройдут. Это здорово – вы хотите, чтобы эти дела продолжали работать. Теперь добавьте значение из вашего отчета, которое не работает правильно. Ваш новый тест, скорее всего, провалится. Выясните, почему он не работает, исправьте его и получите зеленый цвет (все тесты проходят). Запустите свой отчет. Посмотрите, что еще сломано; напишите тест; сделайте так, чтобы он прошел. Очень скоро вы обнаружите, что ваш отчет работает.
Сто строк кода для этой базовой функции.
ThreeTen-дополнительные
Ответ Виталия Федоренко верен, описывая, как выполнить этот расчет современным способом с классами java.time ( Duration & ChronoUnit ), встроенными в Java 8 и позже (и обратно перенесенными в Java 6 & 7 и в Android ).
Если вы регулярно используете в своем коде число дней, вы можете заменить простые целые числа с помощью класса. Класс Days можно найти в проекте ThreeTen-Extra , расширении java.time и испытательном полигоне для возможных будущих дополнений к java.time. Класс Days обеспечивает типобезопасный способ представления количества дней в приложении. Класс включает в себя удобные константы для ZERO и ONE .
Учитывая старые устаревшие объекты java.util.Date в вопросе, сначала преобразуйте их в современные объекты java.time.Instant . Старые классы даты и времени имеют новые добавленные методы для облегчения преобразования в java.time, например java.util.Date::toInstant .
Передайте оба объекта Instant в фабричный метод для org.threeten.extra.Days .
В текущей реализации (2016-06) это оболочка , вызывающая java.time.temporal.ChronoUnit.DAYS.between , прочитайте документ класса ChronoUnit для получения подробной информации. Для ясности: все прописные буквы DAYS находятся в перечислении ChronoUnit , а начальные-cap Days -это класс из ThreeTen-Extra.
Вы можете передать эти Days объектов вокруг вашего собственного кода. Вы можете сериализовать строку в стандартном формате ISO 8601 , вызвав toString . Этот формат PnD использует P для обозначения начала и D означает “days”, с количеством дней между ними. Оба класса java.time и ThreeTen-Extra используют эти стандартные форматы по умолчанию при создании и анализе строк, представляющих значения даты и времени.
Этот код вычисляет дни между 2 строками дат:
Android / Java – разница по дате в днях
Я получаю текущую дату (в формате 12/31/1999, т. Е. Мм / дд / гггг), используя следующий код:
И у меня другая дата в формате: 2010-08-25 (т. Е. Yyyy / mm / dd),
Поэтому я хочу найти разницу между датой в количестве дней, как мне найти разницу в днях?
(Другими словами, я хочу найти разницу между CURRENT DATE – yyyy / mm / dd отформатированной датой )
Не очень надежный метод, лучше использовать JodaTime
Чтобы проанализировать дату из строки, вы можете использовать
Хотя, поскольку вы уверены в формате даты … Вы также можете сделать Integer.parseInt() на его подстроках, чтобы получить их числовые значения.
Это НЕ моя работа, нашла ответ здесь . Не хотел бы сломанной ссылки в будущем :).
Ключом является эта линия для учета дневного света, полный код.
Или попробуйте передать TimeZone в качестве параметра daysBetween() и вызовите setTimeZone() в sDate и eDate .
Итак, вот оно:
GetDatePart (), взятый отсюда
Нюансы: найти разницу между двумя датами не так просто, как вычесть две даты и делить результат на (24 * 60 * 60 * 1000). Infact, его ошибочный!
Например: разница между двумя датами 03/24/2007 и 03/25/2007 должна составлять 1 день; Однако, используя вышеуказанный метод, в Великобритании вы получите 0 дней!
Посмотрите сами (код ниже). Переход на миллисекунду приведет к округлению ошибок, и они станут наиболее очевидными, как только у вас появится маленькая вещь, например, «Переход на летнее время».
Полный код:
ВЫВОД:
Руководство – Дни между: 01-янв-2007 и 02-янв-2007: 1
Календарь – Дни между: 01-янв-2007 и 02-янв-2007: 1
Руководство – Дни между: 24 марта 2007 года и 25 марта 2007 года: 0
Календарь – Дни между: 24 марта 2007 года и 25 марта 2007 года: 1
Большинство ответов были хорошими и правильными для вашей проблемы
Поэтому я хочу найти разницу между датой в количестве дней, как мне найти разницу в днях?
Я предлагаю этот простой и понятный подход, который гарантированно даст вам правильную разницу в любом часовом поясе:
Использовать API jodatime
Где «start» и «end» – ваши объекты DateTime . Чтобы проанализировать вашу дату. Строки в объекты DateTime используют метод parseDateTime
Существует также специальная библиотека JodaTime для Android .
Этот фрагмент учитывает летнее время и равен O (1).
Это простой и лучший расчет для меня и может быть для вас.
Correct Way ответа Сэма Кэста работает только в том случае, если первая дата была раньше второй. Более того, он вернет 1, если две даты будут в течение одного дня.
Это решение, которое лучше всего подходит для меня. Как и большинство других решений, он по-прежнему будет показывать неверные результаты в течение двух дней в году из-за неправильного смещения дневного света.
Лучший и простой способ сделать это
Используйте следующие функции:
Все эти решения имеют одну из двух проблем. Либо решение не является абсолютно точным из-за ошибок округления, високосных дней и секунд и т. Д., Или вы заканчиваете цикл за количество дней между двумя неизвестными датами.
Это решение решает первую проблему и улучшает вторую примерно в 365 раз, лучше, если вы знаете, каков ваш максимальный диапазон.
Если вам нужны дни между датами (без учета последней даты), просто избавьтесь от + 1 когда вы увидите endDay – startDay + 1 .
ТЛ; др
Детали
Другие ответы устарели. Старые классы с датами, в комплекте с самыми ранними версиями Java, оказались плохо спроектированными, запутанными и сложными. Избежать их.
java.time
Проект Joda-Time был очень успешным в качестве замены для тех старых классов. Эти классы послужили источником вдохновения для платформы java.time, встроенной в Java 8 и более поздних версий .
Большая часть функциональности java.time возвращается на Java 6 и 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP .
LocalDate
Класс LocalDate представляет собой значение даты только без времени и без часового пояса.
Разборные строки
Если ваши входные строки соответствуют стандарту ISO 8601 , класс LocalDate может непосредственно анализировать строку.
Если не в формате ISO 8601, определите шаблон форматирования с помощью DateTimeFormatter .
Истекшие дни через ChronoUnit
Теперь получите количество дней, прошедших между этой парой объектов LocalDate . ChronoUnit вычисляет прошедшее время.
Если вы не знакомы с перечислениями Java, знайте, что они намного мощнее и полезнее, чем обычные перечисления на большинстве других языков программирования. См. Enum класса Enum , учебник Oracle и Википедию, чтобы узнать больше.
О java.time
Рамка java.time встроена в Java 8 и более поздних версий . Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date , Calendar и SimpleDateFormat .
Проект Joda-Time , теперь в режиме обслуживания , советует перейти на классы java.time .
Дополнительную информацию можно найти в учебнике Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .
Где получить классы java.time?
- Java SE 8 и SE 9 и более поздние версии
- Встроенный.
- Часть стандартного Java API с интегрированной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport .
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- См. Как использовать ThreeTenABP ….
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval , YearWeek , YearQuarter и т . Д.
Существует простое решение, которое, по крайней мере, для меня, является единственным возможным решением.
Проблема в том, что все ответы, которые я вижу, бросают вокруг – используя Joda, или Calendar, или Date, или что-то еще – учитывайте только миллисекунды. Они заканчивают подсчет количества 24-часовых циклов между двумя датами , а не фактическим количеством дней . Так что с 1 января 11:00 до 2 января 1:00 вернется 0 дней.
Чтобы подсчитать фактическое количество дней между startDate и endDate , просто выполните:
Это вернет «1» между 2 января и 1 января. Если вам нужно подсчитать конец дня, просто добавьте от 1 до нескольких daysBetween (мне нужно было сделать это в моем коде, так как я хотел подсчитать общее количество дней в диапазоне).
Это несколько похоже на то, что Даниэль предложил, но меньший код, я полагаю.
Еще один способ:
Я нашел очень простой способ сделать это, и это то, что я использую в своем приложении.
Допустим, у вас есть даты в объектах Time (или что-то еще, нам просто нужны миллисекунды):
Joda времени
Лучший способ – использовать Joda-Time , очень успешную библиотеку с открытым исходным кодом, которую вы добавили бы в свой проект.