Новый 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 в значительной степени вдохновлен 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
Другие вопросы по тегам