Несколько лет назад я опубликовал пост в блоге « Очень полезное перечисление 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, являются их собственными. |