LocalDate из YearMonth с nth DayOfWeek - PullRequest
       35

LocalDate из YearMonth с nth DayOfWeek

0 голосов
/ 23 декабря 2018

Я хотел бы преобразовать YearMonth в LocalDate с указанным DayOfWeek, например, во второй вторник февраля 2019 года.

Следующий код выдает DateTimeException:

YearMonth yearMonth = YearMonth.of(2019, Month.FEBRUARY);
TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);

LocalDate date = LocalDate.from(yearMonth).with(secondTuesday);

Чтобы заставить мой код работать, мне нужно заменить последнюю строку на

LocalDate date = yearMonth.atDay(1).with(secondTuesday);

Нет ли более чистого решения, которое не требует использования atDay(1)?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы уже нашли лучшее и самое чистое (или наименее плохое) решение:

LocalDate date = yearMonth.atDay(1).with(secondTuesday);

Аргумент atDay не обязательно должен быть равен 1, но он должен бытьдействительный день рассматриваемого месяца, так почему бы не 1?

with() всегда возвращает тот же тип, который вы вызывали.То есть YearMonth.with() всегда будет возвращать YearMonth, а не LocalDate.Поэтому вы не можете использовать свой регулятор там.

Я понимаю и разделяю ваши возражения, но то, что у вас уже есть, - лучшее, что мы можем сделать.Вы можете и, вероятно, должны заключить его в метод с хорошим именем.

0 голосов
/ 23 декабря 2018

Я считаю, что ваш код почти готов.Важным моментом для использования метода TemporalAdjusters.dayOfWeekInMonth () является предоставление LocalDate с указанием дня.

Ваш пример верен, но если вы хотите быть немного более ясным, вы можете изменить на:

TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);
LocalDate dateLocalDate = LocalDate.of(2019, Month.FEBRUARY, 1).with(secondTuesday);

И поместите этот код в метод, например так:

public static void main(String[] args) {
    LocalDate localDate = getLocalDateByDayOfWeek(2019, Month.FEBRUARY, 2, DayOfWeek.TUESDAY);
    System.out.println(localDate);
}

private static LocalDate getLocalDateByDayOfWeek(int year, Month month, int weekNumber, DayOfWeek dayOfWeek) {
    TemporalAdjuster temporalWeek = TemporalAdjusters.dayOfWeekInMonth(weekNumber, dayOfWeek);
    return LocalDate.of(year, month, 1).with(temporalWeek);
}

Здесь вы можете найти документацию по этому методу: Документы TemporalAdjusters

...