Java 8 New Date/Time API - Часть 7
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8.
1. Введение
В предыдущей статье мы узнали что такое Period и Duration в Java 8. В этой статье мы рассмотрим TemporalAdjusters. С помощью TemporalAdjusters можно решать довольно специфические задачи, к примеру, узнать какое число будет в следующее воскресенье или получить последний день месяца (кто знает, зачем он вам понадобился). Такое не каждый день пригодится, но раз в году и ... сами знаете что, поэтому знать будет полезно.
2. Поехали
Например, мы хотим узнать дату 4-го воскресенья в месяце - не проблема:
1 2 3 |
LocalDate localDate = LocalDate.of(2018, Month.AUGUST, 24); TemporalAdjuster fourthSunday = TemporalAdjusters.dayOfWeekInMonth(4, DayOfWeek.SUNDAY); System.out.println(localDate.with(fourthSunday)); // 2018-08-26 |
Возможно, мы хотим узнать дату "страшного дня" - первый понедельник месяце
1 2 3 |
LocalDate localDate = LocalDate.of(2017, Month.MARCH, 19); TemporalAdjuster firstMonInMonth = TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY); System.out.println(localDate.with(firstMonInMonth)); |
Или же нам хочется узнать, сколько осталось до "сладостного дня" - последней пятницы
1 2 3 4 5 6 |
LocalDate localDate = LocalDate.of(2017, Month.April, 21); TemporalAdjuster lastFriInMonthAdjuster = TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY); LocalDate lastFri = localDate.with(lastFriInMonthAdjuster); // 2017-04-28 Period until = localDate.until(lastFri); System.out.println(until.getDays()); // 7 |
Хотим всё первое? Да легко
1 2 3 4 5 6 7 8 9 10 11 |
LocalDate localDate = LocalDate.of(2017, Month.MAY, 10); TemporalAdjuster firstDayOfMonth = TemporalAdjusters.firstDayOfMonth(); TemporalAdjuster firstDayOfNextMonth = TemporalAdjusters.firstDayOfNextMonth(); TemporalAdjuster firstDayOfYear = TemporalAdjusters.firstDayOfYear(); TemporalAdjuster firstDayOfNextYear = TemporalAdjusters.firstDayOfNextYear(); System.out.println(localDate.with(firstDayOfMonth)); // 2017-04-01 System.out.println(localDate.with(firstDayOfNextMonth)); // 2017-05-01 System.out.println(localDate.with(firstDayOfYear)); // 2017-01-01 System.out.println(localDate.with(firstDayOfNextYear)); // 2018-01-01 |
Нужно узнать последний день месяца или года? Все невозможное возможно
1 2 3 4 5 6 7 |
LocalDate localDate = LocalDate.of(2017, Month.APRIL, 17); TemporalAdjuster lastDayOfMonth = TemporalAdjusters.lastDayOfMonth(); TemporalAdjuster lastDayOfYear = TemporalAdjusters.lastDayOfYear(); System.out.println(localDate.with(lastDayOfMonth)); // 2017-04-30 System.out.println(localDate.with(lastDayOfYear)); // 2017-12-31 |
Срочно спросили когда будет следующий вторник, а вы не знаете? TemporalAdjusters всегда поможет
1 2 3 |
LocalDate localDate = LocalDate.of(2020, Month.OCTOBER, 28); TemporalAdjuster nextTue = TemporalAdjusters.next(DayOfWeek.TUESDAY); System.out.println(localDate.with(nextTue)); // 2020-11-03 |
И еще один похожий метод может прийти на помощь
1 2 3 4 |
LocalDate localDate = LocalDate.of(2020, Month.OCTOBER, 28); TemporalAdjuster nextOrSameWed = TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY); System.out.println(localDate.with(nextOrSameWed)); // 2020-10-28 |
Особенность его в том, что если текущий день недели совпадает с желаемым, то он таким и останется. Отсюда и название, nextOrSame.
И еще два метода на эту же тематику
1 2 3 4 5 6 7 |
LocalDate localDate = LocalDate.of(2020, Month.OCTOBER, 28); TemporalAdjuster previousThu = TemporalAdjusters.previous(DayOfWeek.THURSDAY); TemporalAdjuster previousOrSameSat = TemporalAdjusters.previousOrSame(DayOfWeek.SATURDAY); System.out.println(localDate.with(previousThu)); // 2020-10-22 System.out.println(localDate.with(previousOrSameSat)); // 2020-10-24 |
На этом все, это была последняя статья из цикла про Java 8 New Date/Time API. Спасибо, что были с нами 🙂