С окончательным выпуском 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 method LocalDate 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
- Исходный код этого поста