Java 8 New Date/Time API - Часть 2
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
1. Введение
В предыдущей статье мы узнали, как создать дату и время в Java 8. В этой статье мы рассмотрим добавление и отнимание дат и времени.
2. Добавление в LocalDate
Для добавления нескольких дней или чего-то другого в LocalDate существуют методы plus(), plusDays(), plusWeeks(), plusMonths()
1 2 3 4 5 6 |
LocalDate now = LocalDate.now(); // 2018-01-21 LocalDate plus2Days = now.plusDays(2); // 2018-01-23 LocalDate plusWeek = now.plusWeeks(1); // 2018-01-28 LocalDate plus3Months = now.plusMonths(3); // 2018-04-21 LocalDate plusPeriod = now.plus(Period.ofDays(3)); // 2018-01-24 LocalDate plusMillennia = now.plus(1, ChronoUnit.MILLENNIA); // 3018-01-21 |
При добавлении к LocalDate всегда создается новый экземпляр класса т.к. все классы в новом API являются неизменяемыми.
Метод plus() перегружен и принимает либо TemporalAmount (интерфейс, реализации - Duration, Period) либо количество того, что мы хотим добавить и собственно ChronoUnit (enum, есть значение от NANOS до FOREVER). Не все ChronoUnit являются валидными для LocalDate. К примеру, нельзя добавить время (секунды, минуты часы и тд.) и бесконечность.
3. Отнимание в LocalDate
Отнимание схоже с добавлением
1 2 3 4 5 6 |
LocalDate now = LocalDate.now(); // 2018-01-21 LocalDate minusDays = now.minusDays(3); // 2018-01-18 LocalDate minusWeeks = now.minusWeeks(2); // 2018-01-07 LocalDate minusMonths = now.minusMonths(4); // 2017-09-21 LocalDate minusPeriod = now.minus(Period.ofDays(1)); // 2018-01-20 LocalDate minusEras = now.minus(1, ChronoUnit.CENTURIES); // 1918-01-21 |
На счет ChronoUnit действуют те же правила, что и для добавления.
Забавно то, что можно отнять отрицательное число (как и добавить отрицательное) и это будет валидно!
1 2 3 |
LocalDate now = LocalDate.now(); // 2018-01-21 LocalDate plusNegative = now.plusDays(-1); // 2018-01-20 LocalDate minusNegative = now.minusDays(-1); // 2018-01-22 |
4. Добавление в LocalTime
Добавить к LocalTime можно от наносекунд до полудня
1 2 3 4 5 6 7 |
LocalTime now = LocalTime.now(); // 08:49:39.678703 LocalTime plusNanos = now.plusNanos(100_000); // 08:49:39.678803 LocalTime plusSeconds = now.plusSeconds(20); // 08:49:59.678703 LocalTime plusMinutes = now.plusMinutes(20); // 09:09:39.678703 LocalTime plusHours = now.plusHours(6); // 14:51:58.601216 LocalTime plusMillis = now.plus(Duration.ofMillis(100)); // 08:49:39.778703 LocalTime plusHalfDay = now.plus(1, ChronoUnit.HALF_DAYS); // 20:49:39.678703 |
В данном случае валидными ChronoUnit считаются только те, которые относятся ко времени, а не датам. К примеру, при использовании ChronoUnit.DAYS мы получим UnsupportedTemporalTypeException.
5. Отнимание в LocalTime
Все так же как и в добавлении
1 2 3 4 5 6 7 |
LocalTime now = LocalTime.now(); // 08:57:19.743004 LocalTime minusNanos = now.minusNanos(100_000); // 08:57:19.742904 LocalTime minusSeconds = now.minusSeconds(20); // 08:56:59.743004 LocalTime minusMinutes = now.minusMinutes(20); // 08:37:19.743004 LocalTime minusHours = now.minusHours(6); // 02:57:19.743004 LocalTime minusMillis = now.minus(Duration.ofMillis(100)); // 08:57:19.643004 LocalTime minusHalfDay = now.minus(1, ChronoUnit.HALF_DAYS); // 20:57:19.743004 |
Не баг а фича с отрицательным добавлением/отниманием также работает.
6. Добавление и отнимание в LocalDateTime
Поскольку LocalDateTime это и дата и время, то методы по добавлению/отниманию просто делегируют исполнение методам из LocalDate и LocalTime.
Добавление
1 2 3 4 5 6 7 8 9 10 11 |
LocalDateTime now = LocalDateTime.now(); // 2018-01-21T09:11:48.486298 LocalDateTime minusNanos = now.plusNanos(780_000_000); // 2018-01-21T09:11:49.266298 LocalDateTime minusSeconds = now.plusSeconds(59); // 2018-01-21T09:12:47.486298 LocalDateTime minusMinutes = now.plusMinutes(5); // 2018-01-21T09:16:48.486298 LocalDateTime minusHours = now.plusHours(3); // 2018-01-21T12:11:48.486298 LocalDateTime minusDays = now.plusDays(7); // 2018-01-28T09:11:48.486298 LocalDateTime minusWeeks = now.plusWeeks(3); // 2018-02-11T09:11:48.486298 LocalDateTime minusMonths = now.plusMonths(5); // 2018-06-21T09:11:48.486298 LocalDateTime minusYears = now.plusYears(2); // 2020-01-21T09:11:48.486298 LocalDateTime minusPeriod = now.plus(Period.ofWeeks(2)); // 2018-02-04T09:11:48.486298 LocalDateTime minusDecades = now.plus(1, ChronoUnit.DECADES); // 2028-01-21T09:11:48.486298 |
Отнимание
1 2 3 4 5 6 7 8 9 10 11 |
LocalDateTime now = LocalDateTime.now(); // 2018-01-21T09:09:33.650251 LocalDateTime minusNanos = now.minusNanos(780_000_000); // 2018-01-21T09:09:32.870251 LocalDateTime minusSeconds = now.minusSeconds(59); // 2018-01-21T09:08:34.650251 LocalDateTime minusMinutes = now.minusMinutes(5); // 2018-01-21T09:04:33.650251 LocalDateTime minusHours = now.minusHours(3); // 2018-01-21T06:09:33.650251 LocalDateTime minusDays = now.minusDays(7); // 2018-01-14T09:09:33.650251 LocalDateTime minusWeeks = now.minusWeeks(3); // 2017-12-31T09:09:33.650251 LocalDateTime minusMonths = now.minusMonths(5); // 2017-08-21T09:09:33.650251 LocalDateTime minusYears = now.minusYears(2); // 2016-01-21T09:09:33.650251 LocalDateTime minusPeriod = now.minus(Period.ofWeeks(2)); // 2018-01-07T09:09:33.650251 LocalDateTime minusDecades = now.minus(1, ChronoUnit.DECADES); // 2008-01-21T09:09:33.650251 |
И тут также работает фишка с отрицательным добавление/отниманием (методы ведь делегируют все). ChronoUnit в этом случае можно выбирать любой (кроме бесконечности, конечно же).
В следующей статье мы рассмотрим сравнение дат и времени. Спасибо, что были с нами 🙂
Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.