Java – Разница между двумя датами

В этом уроке по Java мы рассмотрим программы для поиска разницы между двумя датами в Java.

Первоначальные программы используют новый API даты и времени Java 8. В последней программе мы научимся находить разницу с помощью API Jodatime, который был доступен еще до выпуска Java 8. Если вы все еще не используете Java 8, то JodaTime должен быть вашим первым выбором.

1. Разница дат с использованием API Java 8

Устаревшим классам Java всегда не хватало поддержки для эффективного выражения дат и периодов времени. В Java 8 была сделана первая попытка обновить этот API даты/времени.

1.1. ChronoUnit.between() для разницы во всех единицах времени

Экземпляр ChronoUnit представляет собой стандартный набор единиц датовых периодов. Мы можем использовать его различные типы экземпляров для поиска разницы в конкретных временных мерах.

 LocalDate dateOfBirth = LocalDate.of(1980, Month.JULY, 4);ЛокальнаяДата текущаяДата = ЛокальнаяДата.сейчас();long diffInDays = ChronoUnit.DAYS.between(dateOfBirth, currentDate);long diffInMonths = ChronoUnit.MONTHS.between(dateOfBirth, currentDate);long diffInYears = ChronoUnit.YEARS.between(dateOfBirth, currentDate);

Мы можем использовать ChronoUnit, чтобы узнать разницу в более мелких единицах времени, например, миллисекундах, минутах и т. д. Но в этом случае нам придется использовать LocalDateTime вместо LocalDate, поскольку LocalDate не имеет связанной с ним информации о времени.

LocalDateTime dateTime = LocalDateTime.of(1988, 7, 4, 0, 0);LocalDateTime dateTime2 = LocalDateTime.now();long diffInNano = ChronoUnit.NANOS.between(dateTime, dateTime2);long diffInSeconds = ChronoUnit.SECONDS.between(dateTime, dateTime2);long diffInMilli = ChronoUnit.MILLIS.between(dateTime, dateTime2);long diffInMinutes = ChronoUnit.MINUTES.between(dateTime, dateTime2);long diffInHours = ChronoUnit.HOURS.between(dateTime, dateTime2);

Мы даже можем использовать экземпляры ZonedDateTime, чтобы узнать разницу, когда обе даты находятся в разных часовых поясах.

1.2. Period.between() для разницы в днях, месяцах и годах

Метод between() возвращает период, состоящий из количества лет, месяцев и дней между двумя датами.

  • Обратите внимание, что дата начала включена, но дата окончания исключена.
  • Результатом этого метода может быть отрицательный период, если конец предшествует началу.

Как указано выше, класс Period представляет разницу во времени в формате «x лет, y месяцев и z дней». Поэтому, когда мы вызываем его метод getDays(), он возвращает только часть «z дней».

LocalDate endofCentury = LocalDate.of(2014, 01, 01);LocalDate now = LocalDate.now();Period diff = Period.between(endofCentury, now);System.out.printf("Difference is %d years, %d months and %d days old",diff.getYears(), diff.getMonths(), diff.getDays());

2.3. Duration.between() для разницы в часах, минутах и секундах

Длительность представляет собой разницу во времени в меньших отрезках времени, таких как часы, минуты, секунды, наносекунды и т. д.

LocalDateTime dateTime = LocalDateTime.of(1988, 7, 4, 0, 0);LocalDateTime dateTime2 = LocalDateTime.now();int diffInNano = java.time.Duration.between(dateTime, dateTime2).getNano();long diffInSeconds = java.time.Duration.between(dateTime, dateTime2).getSeconds();long diffInMilli = java.time.Duration.between(dateTime, dateTime2).toMillis();long diffInMinutes = java.time.Duration.between(dateTime, dateTime2).toMinutes();long diffInHours = java.time.Duration.between(dateTime, dateTime2).toHours();

Прежде всего, все три программы достаточно читабельны и гибки, чтобы различать даты в разных единицах времени.

2. Библиотека JodaTime

2.1.Мавен

Начните с импорта библиотеки в проект.

pom.xml<dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10</version></dependency>

2.2.Демо

Поскольку мы все предпочитаем удобство чтения, я предлагаю использовать библиотеку Jodatime(которая, собственно, и вдохновила на создание API даты/времени Java 8).

DateTime dateOfBirth = new DateTime(1988, 7, 4, 0, 0, GregorianChronology.getInstance());DateTime currentDate = new DateTime();Days diffInDays = Days.daysBetween(dateOfBirth, currentDate);Hours diffInHours = Hours.hoursBetween(dateOfBirth, currentDate);Minutes diffInMinutes = Minutes.minutesBetween(dateOfBirth, currentDate);Seconds seconds = Seconds.secondsBetween(dateOfBirth, currentDate);

3. Устаревшие классы Java

Для справки рассмотрим пример поиска разницы дат с использованием классов java.util.Date и SimpleDateFormat.

import java.util.Date;import java.util.concurrent.TimeUnit;public class DateDifference {public static void main(final String[] args) {// First DateDate today = new Date();// Second DateDate sameDayNextMonth = new Date();sameDayNextMonth.setMonth(today.getMonth() + 1);long days = getDateDiff(today, sameDayNextMonth, TimeUnit.DAYS); // 31long hours = getDateDiff(today, sameDayNextMonth, TimeUnit.HOURS); // 744long minutes = getDateDiff(today, sameDayNextMonth, TimeUnit.MINUTES); // 44640long seconds = getDateDiff(today, sameDayNextMonth, TimeUnit.SECONDS); // 2678400long mills = getDateDiff(today, sameDayNextMonth, TimeUnit.MILLISECONDS); // 2678400000}public static long getDateDiff(final Date date1, final Date date2,final TimeUnit timeUnit) {long diffInMillies = date2.getTime() - date1.getTime();return timeUnit.convert(diffInMillies, timeUnit.MILLISECONDS);}}
Прокрутить вверх