Используйте Joda-Time или новый пакет java.time в Java 8.
Обе структуры используют подход Half-Open , где начало включительно , а окончание эксклюзив . Иногда обозначается как [)
. Как правило, это лучший подход для определения отрезков времени.
java.time
Среда java.time, встроенная в Java 8 и более поздние версии, имеет класс Period
для представления промежутка времени в виде количества лет, количества месяцев и количества дней. Но этот класс ограничен целыми днями, без представления часов, минут и секунд.
Обратите внимание, что мы указываем часовой пояс, важный для определения даты. Например, новый день наступает раньше в Париже , чем в Монреале .
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
, которое включает некоторые методы расчета. Обратите внимание, что вычисления возвращают длинную.
long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above.
Я спросил о том, чтобы сделать полный период в java.time, включая часы, минуты, секунды. Невозможно для Java 8. Удивительный обходной путь с использованием связанных библиотек был предложен от Meno Hochschild : используйте класс Duration
, найденный в пакет javax.xml.datatype .
Joda-Time
Вот пример кода в 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
.