Подтвердить что ты не робот

Вычисление разницы в датах в Java

Мне смешно, что Java (или библиотека java.util) не имеет встроенной функции для вычисления разницы в датах. Я хочу вычесть одну дату из другой, чтобы получить истекшее время между ними. Каков наилучший способ сделать это?

Я знаю, что простой способ состоит в том, чтобы разделить время в миллисекундах, а затем преобразовать его в дни. Тем не менее, я хотел знать, работает ли это во всех случаях (с летнего времени и т.д.).

4b9b3361

Ответ 1

Я знаю, что простой способ - взять разница времени в миллисекундах а затем преобразовать их в дни. Тем не менее, я хотел знать, работает во всех случаях (при дневном свете сохранение и т.д.).

Если ваше время получено из дат UTC или это просто разница между двумя вызовами в System.getCurrentTimeMillis(), измеренными в одной и той же системе, вы получите действительное количество миллисекунд в качестве разницы, независимо от любых проблем с часовым поясом, (именно поэтому все должно использовать UTC в качестве формата хранения - гораздо легче перейти с UTC- > локального времени, и если вы попытаетесь пойти другим путем, вам необходимо сохранить локальный часовой пояс вместе с местным временем - или попытаться сделать вывод, gack!)

Что касается превращения этого в несколько дней, вы должны просто разделить на 86400000... с предостережением, что есть случайный прыжок второй через год или около того.

Ответ 2

Java не хватает многого, если вы посмотрите на open source: попробуйте Joda-Time.

Ответ 3

Используйте Joda-Time или новый пакет java.time в Java 8.

Оба фреймворка используют подход Half-Open, где начало включено, в то время как окончание является эксклюзивным. Иногда обозначается как [). Это, как правило, лучший подход для определения промежутков времени.

java.time

Структура java.time, встроенная в Java 8 и более поздняя, ​​имеет класс Period для представления промежутка времени в виде нескольких лет, нескольких месяцев и нескольких дней. Но этот класс ограничен целыми днями, без представления часов, минут и секунд.

Обратите внимание, что мы указываем часовой пояс, имеющий решающее значение для определения даты. Например, новый день появляется раньше в Paris, чем в Монреаль.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );

Затем: 2001-01-01. Сейчас: 2015-09-07. Период: P14Y8M6D. Дней: 5362

В течение целых дней Летнее время (DST) не имеет значения.

Если вы хотите подсчитать общее количество дней, используйте ChronoUnit enum, который включает в себя некоторые методы расчета. Обратите внимание, что вычисления возвращают длинный.

long days = ChronoUnit.DAYS.between( then, now );  // "5362" seen above.

Я спросил о том, как делать полный период в java.time, включая часы, минуты, секунды. Невозможно с Java 8. Неожиданное обходное решение с использованием библиотек было предложено Meno Hochschild: используйте Duration класс, найденный в пакет javax.xml.datatype.

Joda времени

Вот пример кода в Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );

Вызов toString предоставит вам строковое представление в форме, определенной стандартом ISO 8601, PnYnMnDTnHnMnS.

Ответ 4

С библиотекой date4j:

int numDaysBetween = oneDate.numDaysFrom(anotherDate);

Ответ 5

Существует простой способ его реализации. Мы можем использовать метод Calendar.add с циклом. Например, как показано ниже,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");

Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);

минус дней между beginDate и endDate и код, как показано ниже,

int minusDays = 0;
while (true) {
  minusDays++;

  // Day increasing by 1
  beginCalendar.add(Calendar.DAY_OF_MONTH, 1);

  if (dateFormat.format(beginCalendar.getTime()).
            equals(dateFormat.format(endCalendar).getTime())) {
    break;
  }
}
System.out.println("The substractation between two days is " + (minusDays + 1));

Получайте удовольствие! @. @

Ответ 7

Я не согласен с утверждением, что Java не имеет механизма для вычисления разницы между датами.

Java была разработана для глобального использования. Он был спроектирован так, что нет понятия даты, существует только понятие "время в миллисекундах". Любая интерпретация такого универсального времени, как время и дата в определенном месте в рамках конкретного соглашения, является просто проекцией или представлением.

Класс calendar используется для превращения такого абсолютного времени в даты. Вы также можете добавить или вычесть компоненты даты, если вам действительно нужно. Единственный способ обеспечить разницу между компонентами между двумя моментами - это календарь и конкретный. Таким образом, вы можете утверждать, что стандартная библиотека не содержит достаточно грамотного григорианского календаря, и я согласен с тем, что это оставляет желать лучшего.

Как говорится, существует множество реализаций такого рода функций, я вижу, что другие приводили примеры.