21 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Находим разницу между двумя датами в 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.

Читать еще:  Raindrop.io: Еще один шаг к идеальным закладкам

Я использую эту функцию:

посмотреть 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 .

Читать еще:  Статистичний аналіз тесту в MOODLE

Чтобы узнать больше, см. Учебник по 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 .

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: