Статьи

Что нового в Java 8 — API даты

С окончательным выпуском 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 можно узнать намного больше о работе с датами и временем, и этот пост является лишь кратким введением. Спасибо за ваше время.

Ресурсы

Ссылка: Что нового в Java 8 — Date API от нашего партнера по JCG Билла Бекака в блоге Randomечн о кодировании .