Новый API даты и времени в Java 8
На этой странице я прочитал следующее:
Делать вычисления с датами тоже очень просто. Вероятно, лучшее улучшение по сравнению с текущей ситуацией с Java < 1.8:
Period p = Period.of(2, HOURS);
LocalTime time = LocalTime.now();
LocalTime newTime = time.plus(p); // or time.plus(5, HOURS); or time.plusHours(5);
Я не вижу четкого преимущества перед версиями < 1.8.
Может быть, кто-то может дать мне пример? Atm, я спрашиваю себя, откуда происходит улучшение нового API даты и времени.
2 ответа
Решение
С Java < 8 вам нужно написать что-то вроде:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) + 2);
по сравнению с Java 8:
LocalTime now = LocalTime.now();
LocalTime later = now.plus(2, HOURS);
Улучшения по существу на
- читаемость:
Calendar.getInstance()
не очень хорошо назван: трудно сказать, какой экземпляр вы получаете, не читая Javadoc.LocalTime.now()
вполне самоописывает: у вас есть время, и оно сейчас.- Чтобы сместить дату, вы вызываете метод смещения (
plus
) в то время как с Calendar API вы должны вручную изменить поля объекта (в этом примере, час), который подвержен ошибкам.
- простота использования (для сравнения см., например, таблицу внизу этой страницы):
- API календаря сложен в использовании, потому что в нем сочетаются такие понятия, как простая дата (26 июня 2015 г.) и мгновенное время (26 июня 2015 г. в 10:00 UTC) - для предыдущей концепции нет класса
- Новый API времени имеет четкое разделение между различными концепциями даты и времени
- безопасность:
- API Календаря небезопасен: ничто не мешает вам писать
cal.set(123, 2)
который бросил бы не очень полезныйArrayOutOfBoundsException
, Новый API использует перечисления, которые решают эту проблему. - Новый API использует неизменяемые объекты, что делает его безопасным для потоков.
- API Календаря небезопасен: ничто не мешает вам писать
В целом, новый API в значительной степени вдохновлен jodatime, который уже довольно давно является предпочтительным Java Date API. Вы также можете прочитать подробное сравнение даты Java (<1.8) с JodaTime (большая часть должна относиться к API Java 8 Date).
Преимущества нового API даты / времени
- Понятия даты (LocalDate), времени (LocalTime), даты и времени (LocalDateTime), момента времени (Instant) намного понятнее и соответствуют их значению на общем языке.
- Привести дату / время к определенному значению стало проще (метод 'of', например LocalDate.of(2016,1,1))
- Работа с високосными годами (метод isLeapYear) стала тривиальной
- Добавлять / вычитать даты стало очень просто. Например, для ссылки сегодня через 10 лет: LocalDate.now(). PlusYears(10)
- Смещение нумерации месяцев адаптировано к интуиции. "Январь" теперь "1", а не "0", как раньше
Недостатки
- Еще не поддерживается JPA2
- Еще не поддерживается JSF2