Java 9. Части длительности, усечение и деление.

Java 9 представляет несколько новых методов в классе Duration. Прежде чем мы перейдем к деталям, давайте кратко вспомним, что такое Длительность. JavaDoc определяет это как количество времени, основанное на времени, которое является неизменным и потокобезопасным.

Duration.ofHours(-7) // PT-7H
Duration.ofHours(7) // PT7H
Duration.ofSeconds(70) // PT1M10S
Duration.ofNanos(300) // PT0.0000003S
Duration.ofMinutes(-63) // PT-1H-3M S
Duration.ofMinutes(-57) // PT-57M

В комментарии справа вы можете увидеть, какой вывод идет на консоль. Вывод использует формат PTnHnMnS. Если n = 0, то эта часть не отображается. Мы также можем проанализировать вывод строки.

Duration.parse(“PT7H”) // PT7H

Это не всегда просто:

Duration.parse(“-PT-6H+3M”)

Это сработает? да. Он печатает PT5H57M. Итак, похоже, что он может рассчитать время для вас.

Duration.parse(“-PT-6H+3M+7M”)

Это сработает? Мы можем упростить это до -PT-6H+10M. Итак, ответ. Нет, не будет. Это не выражение калькулятора. Давайте теперь перейдем к новым методам, представленным в Java 9.

Извлечение прецизионных деталей

Уже в Java 8 мы могли ввести:

Duration.ofMinutes(130).toMinutes() // 130

Теперь у нас есть новый метод с суффиксом Part:

Duration.ofMinutes(130).toMinutesPart() // 10

Другими словами, он возвращает часы в минутах. Исходный код также довольно тривиален:

public int toMinutesPart() {
  return (int) (toMinutes() % MINUTES_PER_HOUR);
}

То же самое доступно для других значений точности, таких как часы, дни и т. д.

Обрезать

В Apache Commons мы смогли выполнить что-то вроде:

DateUtils.truncate(new Date(), Calendar.DATE)

Теперь аналогичный подход применяется к Duration.

Duration.ofMinutes(130) // PT2H10M
Duration.ofMinutes(130).truncatedTo(ChronoUnit.HOURS) // PT2H
Duration.ofMinutes(130).truncatedTo(ChronoUnit.DAYS) // PT0S
Duration.ofHours(23).truncatedTo(ChronoUnit.DAYS) // PT0S
Duration.ofHours(25).truncatedTo(ChronoUnit.DAYS) // PT24H

Разделять

Еще один новый метод — dividedBy. Здесь мы можем проверить, сколько полных периодов мы можем уместить в определенную продолжительность.

Duration.ofHours(25).dividedBy(Duration.ofHours(12)) // 2
Duration.ofHours(9).dividedBy(Duration.ofHours(2)) // 4

Внутри это работает с большими десятичными числами. Никаких проблем с аппроксимацией даже при больших числах.

Скоро появятся новые идеи по Java 9. А пока вы можете узнать, как Java определяет «навсегда».