С окончательным выпуском Java 8 за углом одной из новых функций, которые меня порадовали, является новый Date API, результат работы над JSR 310 . В то время как лямбда-выражения, безусловно, являются отличительной чертой Java 8, наличие лучшего способа работы с датами является безусловно желанным дополнением. Это быстрый пост (часть 1 из 2 или 3), показывающий некоторые основные моменты новой функциональности Date, на этот раз в основном в классе LocalDate .
Создание новых объектов Date
Создать новый объект Date, представляющий определенный день, так же просто, как:
|
1
2
3
|
LocalDate today = LocalDate.parse("2014-02-27");//or this methodLocalDate bday = LocalDate.of(2014,3,18); |
Добавление к датам
В качестве примера легкости, с которой мы можем работать с датами в Java 8, рассмотрим случай, когда нам нужно добавить либо дни, месяцы или годы к существующей дате. Существуют методы LocalDate.plusDays , LocalDate.plusWeeks , LocalDate.plusMonths LocalDate.plusYears . Существует также универсальный метод LocalDate.plus котором вы указываете, сколько нужно добавить и единицу времени через тип TemporalUnit . Вот несколько примеров:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
@Test public void test_add_to_date() { LocalDate oneMonthFromNow = today.plusDays(30); assertTrue(oneMonthFromNow.isEqual(LocalDate.parse("2014-03-29"))); LocalDate nextMonth = today.plusMonths(1); assertTrue(nextMonth.isEqual(LocalDate.parse("2014-03-27"))); LocalDate future = today.plus(4, ChronoUnit.WEEKS); assertTrue(future.isEqual(LocalDate.parse("2014-03-27"))); } |
Вычитание из дат
Чтобы вычесть дни, недели, месяцы или годы из даты, существуют ожидаемые методы: LocalDate.minusDays , LocalDate.minusMonths и т. Д. Вот несколько примеров вычитания из даты:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Test public void test_subtract_from_date() { assertThat(today.minusWeeks(1).toString(), is("2014-02-20")); assertThat(today.minusMonths(2).toString(), is("2013-12-27")); assertThat(today.minusYears(4).toString(), is("2010-02-27")); Period twoMonths = Period.ofMonths(2); assertThat(today.minus(twoMonths).toString(), is("2013-12-27")); } |
В этом примере мы также представили объект Period .
Определение разницы между датами
Можно утверждать, что различие между двумя датами было самой болезненной операцией, связанной с датами до Java 8. Новый API даты упрощает определение количества дней, недель, месяцев или лет между датами с помощью LocalDate.until метод:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
@Test public void test_get_days_between_dates() { LocalDate vacationStart = LocalDate.parse("2014-07-04"); Period timeUntilVacation = today.until(vacationStart); assertThat(timeUntilVacation.getMonths(), is(4)); assertThat(timeUntilVacation.getDays(), is(7)); assertThat(today.until(vacationStart, ChronoUnit.DAYS), is(127L)); LocalDate libraryBookDue = LocalDate.parse("2000-03-18"); assertThat(today.until(libraryBookDue).isNegative(), is(true)); assertThat(today.until(libraryBookDue, ChronoUnit.DAYS), is(-5094L)); LocalDate christmas = LocalDate.parse("2014-12-25"); assertThat(today.until(christmas, ChronoUnit.DAYS), is(301L)); } |
В этом примере мы снова видим использование объекта Period .
Вывод
Мы завершили наш краткий LocalDate и Java 8 Date API. Очевидно, что в Java 8 можно узнать намного больше о работе с датами и временем, и этот пост является лишь кратким введением. Спасибо за ваше время.
Ресурсы
- Joda Time — библиотека даты и времени Java для использования в версиях Java <8
- Пакет java.time содержит документацию по java для классов, обсуждаемых в этом посте.
- Функциональное программирование в Java 8 отличный ресурс по использованию новых функциональных компонентов в Java 8
- Исходный код этого поста