Статьи

Весьма полезный Java ChronoUnit Enum

Несколько лет назад я опубликовал пост в блоге « Очень полезное перечисление TimeUnit Java », в котором рассматривался перечисление TimeUnit, представленное в JDK 5 . JDK 8 представил более новое перечисление, ChronoUnit , которое лучше подходит, чем TimeUnit для контекстов, отличных от параллелизма, таких как манипуляции с датой и временем.

Расположенный в пакете ChronoUnit класс ChronoUnit реализует интерфейс TemporalUnit, интерфейс , широко используемый в крайне желаемом API даты / времени, представленном в JDK 8. В блоге « Дни между датами в Java 8 » демонстрируется использование этого класса для вычисления периодов времени между двумя экземплярами Temporal .

Сообщение в блоге « Java 9. Где« навсегда »жестко закодировано. »Рассматривает« два новых метода в классе TimeUnit »для JDK 9. Эти методы, toChronoUnit () и of (ChronoUnit) , поддерживают перевод TimeUnit в ChronoUnit и перевод ChronoUnit в TimeUnit . Не все значения в ChronoUnit могут быть переведены в эквивалент в TimeUnit , и в этом случае создается исключение IllegalArgumentException .

Комментарии Javadoc к каждому значению в ChronoUnit описывают, какую единицу времени представляет каждое значение. Тем не менее, мне интересно посмотреть, что Duration возвращается для каждого значения в ChronoUnit . Следующий фрагмент кода запишет эти представления Duration toString() в стандартный вывод для всех значений в перечислении ChronoUnit .

Отображение длительностей ChronoUnits

1
2
3
4
5
for (final ChronoUnit unit : ChronoUnit.values())
{
   final Duration duration = unit.getDuration();
   out.println(unit + ": " + duration + " (" + duration.getSeconds() + " seconds)");
}

При выполнении вышеприведенный код производит следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Nanos: PT0.000000001S (0 seconds)
Micros: PT0.000001S (0 seconds)
Millis: PT0.001S (0 seconds)
Seconds: PT1S (1 seconds)
Minutes: PT1M (60 seconds)
Hours: PT1H (3600 seconds)
HalfDays: PT12H (43200 seconds)
Days: PT24H (86400 seconds)
Weeks: PT168H (604800 seconds)
Months: PT730H29M6S (2629746 seconds)
Years: PT8765H49M12S (31556952 seconds)
Decades: PT87658H12M (315569520 seconds)
Centuries: PT876582H (3155695200 seconds)
Millennia: PT8765820H (31556952000 seconds)
Eras: PT8765820000000H (31556952000000000 seconds)
Forever: PT2562047788015215H30M7.999999999S (9223372036854775807 seconds)

Префикс «PT» в каждом представлении строки Duration показанном выше, указывает, что представление является обозначением продолжительности «period» («P») и обозначением «time» («T») согласно стандарту ISO-8601 . «S», «M» и «H» — секунды, минуты и часы соответственно. Значения ChronoUnit которые представляют единицы времени меньше секунды ( NANOS , MICROS и MILLIS ), показывают «0 секунд», потому что они меньше 1 секунды, а возвращаемое значение является целым long .

Комментарии Javadoc к каждому значению, определенному в классе ChronoUnit , хорошо написаны. Они следуют тому, что, на мой взгляд, является «наилучшей практикой» Javadoc: поместите краткое, но информативное начальное предложение в Javadoc, чтобы оно отображалось в разделе «Сводка метода» сгенерированной HTML-страницы, и добавьте дополнительные полезные детали в предложения после этого исходного резюме приговор. Например, комментарий Javadoc для ChronoUnit.ERAS гласит: « Единица, которая представляет концепцию эпохи. Система календаря ISO не имеет эры, поэтому невозможно добавить эру к дате или дате-времени. Предполагаемая продолжительность эпохи искусственно определяется как 1 000 000 000 лет. При использовании с другими календарными системами никаких ограничений на устройство нет ». Выделенное жирным шрифтом предложение (я добавил этот акцент) — это то, что отображается в «Сводке метода», и весь текст, показанный здесь, отображается над методом в его полном объяснении.

Одним из наиболее интересных значений в перечислении ChronoUnit является FOREVER . Как показано в приведенном выше листинге кода, значение FOREVER имеет Duration «PT2562047788015215H30M7.999999999S», что соответствует 2562047788015215 часам, 30 минутам и 7.999999999 секундам. Или, как выразился Гжегож Гайос , «Java определяет навсегда как 9 223 372 036 854 775 807 секунд. Что составляет 2,92277266 × 10 11 лет. Лучше обязательно запланируйте обновление Java в своем приложении, прежде чем истечет время ».

Когда ChronoUnit.FOREVER будет полезен? Его основанное на Javadoc описание объясняет его основную причину существования: «Искусственная единица, которая представляет концепцию навсегда. Это в основном используется с TemporalField для представления неограниченных полей, таких как год или эра. Предполагаемая продолжительность эры искусственно определяется как наибольшая продолжительность, поддерживаемая Duration ».

TimeUnitполезное перечисление для работы с конструкциями параллелизма Java, и его можно использовать в контекстах, отличных от параллелизма, при условии, что были рассмотрены некоторые серьезные ограничения для этих других контекстов. Представленный в JDK 8 ChronoUnit — лучшее перечисление для этих неконкурентных контекстов и специально разработано для использования с JDK 8 Date / Time API

Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Очень полезный Java ChronoUnit Enum

Мнения, высказанные участниками Java Code Geeks, являются их собственными.