Calendar.DAY_OF_WEEK_IN_MONTH эквивалент в ZonedDateTime в java8 - PullRequest
3 голосов
/ 13 июня 2019

Я пытаюсь проверить День Благодарения (4-й четверг ноября).У меня ZonedDateTime как 2019-11-23T08:43:14.699-07:00[America/Los_Angeles]

Как проверить, четвертый четверг или нет, используя java 8 ZonedDateTime api

В календаре у нас есть Calendar.DAY_OF_WEEK_IN_MONTH для расчета номера неделив месяц.Есть ли такая вещь в ZonedDateTime?

У меня есть это с помощью календаря.

// check Thanksgiving (4th Thursday of November)
    if (cal.get(Calendar.MONTH) == Calendar.NOVEMBER
        && cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) == 4
        && cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
        return false;
    }

Как мне добиться этого с помощью ZonedDateTime?

1 Ответ

2 голосов
/ 13 июня 2019

То, что вам нужно, это выровненная неделя месяца. Первая выровненная неделя месяца - от 1 до 7 месяца, поэтому содержит первый четверг месяца независимо от того, в какой день недели начинается месяц. Вторая выровненная неделя - с 8 по 14 месяца и т. Д.

    ZonedDateTime zdt = ZonedDateTime.parse("2019-11-23T08:43:14.699-07:00[America/Los_Angeles]");
    if (zdt.getMonth().equals(Month.NOVEMBER)
            && zdt.get(ChronoField.ALIGNED_WEEK_OF_MONTH) == 4
            && zdt.getDayOfWeek().equals(DayOfWeek.THURSDAY)) {
        System.out.println("" + zdt + " is on Thanksgiving");
    }

Поскольку День Благодарения наступает 28 ноября этого года, вышеприведенное тестирование фрагмента 23 ноября ничего не печатает. Попробуйте с правильным днем ​​вместо:

    ZonedDateTime zdt = ZonedDateTime.parse("2019-11-28T17:34:56.789-07:00[America/Los_Angeles]");

2019-11-28T16: 34: 56.789-08: 00 [Америка / Los_Angeles] в День Благодарения

...